TensorFlow 用 Swift (アーカイブ モード)

Swift for TensorFlow は、機械学習、コンパイラー、微分可能プログラミング、システム設計などにわたる最新の研究を組み込んだ、機械学習用の次世代プラットフォームの実験でした。このプロジェクトは、2021 年 2 月にアーカイブされました。このプロジェクトの重要な成果には次のものがあります。

このサイトは今後の更新を受け取りません。 API ドキュメントとバイナリのダウンロード、およびOpen Design Review 会議の録画には引き続きアクセスできます。

迅速

Swift はオープンソースの汎用プログラミング言語であり、ユーザー ベースは大きく成長しています。私たちが Swift を選択したのは、Swift にはオープンな言語設計プロセスがあることと、「 TensorFlow にSwiftを使用する理由」ドキュメントで詳しく説明されている特定の技術的理由があるためです。ほとんどの読者はこの機能に馴染みがないと思われるので、ここではその他の重要な点について簡単に触れておきます。

Swift の開発は 2010 年に始まり、学術的な目新しさを追求したり、プログラミング手法を宗教的に広めたりするのではなく、プログラミング言語設計のベスト プラクティスを 1 つのシステムにまとめることを目的としていました。その結果、マルチパラダイム開発 (例: 関数型、OOP、ジェネリック、手続き型など) を 1 つのシステムでサポートし、学術言語から多くのよく知られた概念 (例:パターン マッチング代数データ型、型クラス) を導入します。最前線へ。開発者にすべてのコードを Swift で書き直すことを強く推奨するのではなく、他の言語との相互運用性に実際的に重点を置いています。たとえば、C ヘッダー ファイルを直接インポートしてFFIなしで使用できるようにしたり、(現在は) ラッパーなしで Python API を使用できるようにしたりします。 。

Swift には、学びやすく使いやすいことに重点を置き、低レベルのシステム プログラミングから高レベルのスクリプトまでを網羅するという大胆な目標があります。 Swift は学習と使用が簡単であるだけでなく強力である必要があるため、複雑さの漸進的開示の原則に依存しており、複雑さのコストをその複雑さから恩恵を受ける人々に積極的に負担させます。 「スクリプト言語の感触」と高いパフォーマンスの組み合わせは、機械学習に非常に役立ちます。

Swift の設計に関する最後の重要な側面は、Swift 言語の多くが実際にその標準ライブラリに実装されていることです。 IntBoolなどの「組み込み」型は、実際には、マジック型と操作をラップする標準ライブラリで定義された単なる構造体です。そのため、Swift は単なる「LLVM の構文糖」であると冗談を言うことがあります。

Swift の優れた点は他にもたくさんあり、オンラインで利用できるコンテンツも大量にあります。 Swift プログラミングの一般的な概念について詳しく知りたい場合は、以下のリンクから始めてください。

  • Swift ツアーは、 Swift の高レベルの構文と操作性をざっと確認できるツアーで、より大きな書籍「The Swift Programming Language」の一部です。
  • Building Better Apps with Value Types in Swift 」 [ YouTube ] で説明されているように、値セマンティクスは強力であり、Swift コードで重要な役割を果たします。
  • Swift は古典的な OOP をサポートしていますが、Haskell 型システムのアイデアを採用しています。これについては、「 Protocol-Oriented Programming in Swift 」 [ YouTube ] で説明されています。

1 つの警告: Swift は初期に急速に進化したため、Swift 3 (2016 年リリース) より前のものには注意する必要があります。

TensorFlow に Swift を使用する理由

Swift for TensorFlow は、機械学習モデルを開発する新しい方法です。これにより、 Swift プログラミング言語に直接統合されたTensorFlowのパワーが得られます。私たちは、機械学習パラダイムが非常に重要であるため、一流の言語とコンパイラーのサポートに値すると信じています。

機械学習の基本的なプリミティブは勾配ベースの最適化、つまり関数の導関数を計算してパラメーターを最適化することです。 Swift for TensorFlow を使用すると、 gradient(of:)のような微分演算子を使用して関数を簡単に微分したり、メソッドgradient(in:)を呼び出してモデル全体に​​関して微分したりできます。これらの微分 API は、 Tensor関連の概念だけで利用できるわけではありません。これらは、 FloatDouble 、SIMD ベクトル、および独自のデータ構造を含む、 Differentiableプロトコルに準拠するすべての型に一般化されています。

// 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

Swift for TensorFlow プロジェクトには、派生製品を超えて、ユーザーの生産性を向上させる洗練されたツールチェーンが付属しています。 Jupyter ノートブックで Swift を対話的に実行し、最新の深層学習ライブラリの大規模な API サーフェスを探索するのに役立つオートコンプリートの提案を取得できます。ブラウザで数秒ですぐに始めることができます。

Swift の強力な Python 統合のおかげで、TensorFlow 用の Swift への移行は非常に簡単です。使い慣れた構文でお気に入りの Python ライブラリを簡単に呼び出すことができるため、Python コードを段階的に移行する (またはお気に入りの Python ライブラリを引き続き使用する) ことができます。

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!