O Swift for TensorFlow foi um experimento na plataforma de próxima geração para aprendizado de máquina, incorporando as pesquisas mais recentes em aprendizado de máquina, compiladores, programação diferenciável, design de sistemas e muito mais. Foi arquivado em fevereiro de 2021. Algumas realizações significativas deste projeto incluem:
- Adicionada programação diferenciável integrada à linguagem na linguagem Swift. Este trabalho continua no compilador oficial do Swift.
- Desenvolveu uma API de aprendizagem profunda orientada para valores mutáveis e semântica
- Promoveu o desenvolvimento de um jardim modelo com mais de 30 modelos de uma variedade de disciplinas de aprendizado profundo .
- Habilitou novas pesquisas que combinam aprendizado profundo com modelos gráficos probabilísticos para rastreamento de movimento 3D e muito mais.
- Equipado com um (n quase) protótipo puro Swift de um tempo de execução de GPU + CPU com suporte a pmap .
- Desmembrou vários esforços colaterais de código aberto que continuam em desenvolvimento ativo:
- PythonKit : interoperabilidade Python com Swift.
- swift-jupyter : permite o uso de Swift nos blocos de anotações Jupyter.
- swift-benchmark : Fornece um conjunto robusto de benchmarking para código Swift.
- Desmembrou vários outros esforços de código aberto:
- pinguim : programação paralela, estruturas de dados, algoritmos de gráfico e muito mais.
- Tensores se encaixando perfeitamente : análise estática de incompatibilidades de forma de tensor.
- Propostas de evolução rápida propostas e implementadas:
Este site não receberá mais atualizações. A documentação da API e os downloads binários continuarão acessíveis, assim como as gravações das reuniões do Open Design Review .
Rápido
Swift é uma linguagem de programação de código aberto de propósito geral, que possui uma grande e crescente base de usuários. Escolhemos o Swift porque ele tem um processo de design de linguagem aberta e por motivos técnicos específicos detalhados no documento " Por que o Swift para TensorFlow ". Presumimos que a maioria dos leitores não esteja familiarizada com ele, portanto, tocaremos brevemente em algumas coisas importantes adicionais sobre ele aqui.
O desenvolvimento do Swift começou em 2010 e teve como objetivo reunir as melhores práticas de design de linguagens de programação em um sistema, em vez de tentar novidades acadêmicas ou propagar religiosamente metodologias de programação. Como resultado, ele suporta o desenvolvimento multiparadigma (por exemplo, funcional, OOP, genérico, procedural, etc) em um único sistema e traz muitos conceitos bem conhecidos de linguagens acadêmicas (por exemplo, correspondência de padrões , tipos de dados algébricos e classes de tipo) na vanguarda. Em vez de encorajar fortemente os desenvolvedores a reescrever todo o seu código em Swift, ele se concentra pragmaticamente na interoperabilidade com outras linguagens, por exemplo, permitindo que você importe arquivos de cabeçalho C diretamente e os use sem um FFI e (agora) a capacidade de usar APIs Python sem wrappers .
O Swift tem o objetivo audacioso de abranger desde a programação de sistemas de baixo nível até os scripts de alto nível, com foco em ser fácil de aprender e usar . Como o Swift precisa ser fácil de aprender e usar, mas também poderoso, ele se baseia no princípio da divulgação progressiva da complexidade , que impacta agressivamente o custo da complexidade nas pessoas que se beneficiam dessa complexidade. A "sensação de linguagem de script" combinada com alto desempenho é muito útil para o aprendizado de máquina.
Um aspecto final pertinente do design do Swift é que grande parte da linguagem Swift é realmente implementada em sua biblioteca padrão. Tipos "internos" como Int e Bool são, na verdade, apenas estruturas definidas na biblioteca padrão que envolvem tipos e operações mágicas. Como tal, às vezes brincamos que Swift é apenas "açúcar sintático para LLVM".
Há muito mais coisas legais sobre o Swift e uma tonelada de conteúdo disponível online. Se você estiver interessado em aprender mais sobre os conceitos gerais de programação Swift, aqui estão alguns links para começar:
- Um Tour Swift é um tour que pode ser percorrido rapidamente pela sintaxe e sensação de alto nível do Swift e é parte do livro "The Swift Programming Language".
- A semântica de valor é poderosa e desempenha um papel importante no código Swift, conforme explicado em " Construindo melhores aplicativos com tipos de valor em Swift " [ YouTube ].
- O Swift suporta OOP clássico, mas adaptou as idéias do sistema de tipos Haskell. Isso é explicado em " Programação orientada a protocolo em Swift " [ YouTube ].
Um aviso: o Swift evoluiu rapidamente em seus primeiros anos, então você deve ter cuidado com qualquer coisa antes do Swift 3 (lançado em 2016).
Por que Swift para TensorFlow?
Swift for TensorFlow é uma nova maneira de desenvolver modelos de aprendizado de máquina. Ele oferece o poder do TensorFlow diretamente integrado à linguagem de programação Swift . Acreditamos que os paradigmas de aprendizado de máquina são tão importantes que merecem linguagem de primeira classe e suporte de compilador .
Uma primitiva fundamental no aprendizado de máquina é a otimização baseada em gradiente: derivadas de funções de computação para otimizar parâmetros. Com o Swift para TensorFlow, você pode facilmente diferenciar funções usando operadores diferenciais como gradient(of:)
, ou diferenciar em relação a um modelo inteiro chamando o método gradient(in:)
. Essas APIs de diferenciação não estão disponíveis apenas para conceitos relacionados ao Tensor
- elas são generalizadas para todos os tipos em conformidade com o protocolo Differentiable
, incluindo Float
, Double
, vetores SIMD e suas próprias estruturas de dados.
// Custom differentiable type.
struct Model: Differentiable {
var w: Float
var b: Float
func applied(to input: Float) -> Float {
return w * input + b
}
}
// Differentiate using `gradient(at:_:in:)`.
let model = Model(w: 4, b: 3)
let input: Float = 2
let (𝛁model, 𝛁input) = gradient(at: model, input) { model, input in
model.applied(to: input)
}
print(𝛁model) // Model.TangentVector(w: 2.0, b: 1.0)
print(𝛁input) // 4.0
Além dos derivados, o projeto Swift for TensorFlow vem com um conjunto de ferramentas sofisticado para tornar os usuários mais produtivos. Você pode executar o Swift interativamente em um bloco de notas Jupyter e obter sugestões úteis de preenchimento automático para ajudá-lo a explorar a enorme superfície de API de uma biblioteca de aprendizado profundo moderna. Você pode começar diretamente no seu navegador em segundos !
Migrar para o Swift para TensorFlow é muito fácil graças à poderosa integração Python do Swift. Você pode migrar incrementalmente seu código Python (ou continuar a usar suas bibliotecas Python favoritas), porque você pode facilmente chamar sua biblioteca Python favorita com uma sintaxe familiar:
import TensorFlow
import Python
let np = Python.import("numpy")
let array = np.arange(100).reshape(10, 10) // Create a 10x10 numpy array.
let tensor = Tensor<Float>(numpy: array) // Seamless integration!