Swift Transformers リリース: Apple デバイス上でオンデバイス LLM を実行する
本日リリース
Hugging Face は、Apple デバイス上でのオンデバイス LLM の実行を可能にするため、swift-transformers、swift-chat、更新された exporters、更新された transformers-to-coreml Space、および Llama 2 7B と Falcon 7B の Core ML バージョンをリリースしました。 swift-transformers パッケージは、テキスト生成のための transformers のような API の提供を目指している、開発中の Swift ライブラリです。swift-chat アプリは、その使用方法を示すデモです。exporters Python パッケージと transformers-to-coreml Space は、Llama 2 や Falcon などのモデルを Core ML に変換するために更新されました。Llama-2-7b-chat-coreml や Falcon-7b-instruct を含む、すぐに使える Core ML モデルが Hub で利用可能です。
タスクの概要
Apple デバイスで LLM を実行するには、Core ML へのモデル変換、速度とメモリのための最適化、およびトークン化、モデルのロード、テキスト生成のための Swift フレンドリーな API の提供が含まれます。 変換は最初のステップですが、最適化と使いやすい Swift インターフェースも同様に重要です。この記事では、これらの各領域について、ツールがすでに存在する場所と、まだ作業が必要な場所を指摘しながら詳しく説明します。
Core ML への変換
Llama 2 などのモデルを Core ML に変換するには、transformers-to-coreml Space、exporters Python パッケージ、または coremltools を直接使用して行うことができ、Llama 2 のコードにおける型不一致の問題を修正したことで、プロセスは成功しました。 推奨されるアプローチは、まずコード不要の transformers-to-coreml Space を試すことです。失敗した場合は、より詳細な制御ができる exporters を使用し、最大限の柔軟性を求める場合は coremltools に戻ってください。Llama 2 については、以前の失敗に対処した後、3 つの方法すべてで変換に成功しました。
重要な教訓
coremltools を使用する必要がある場合は、最新バージョンである 7.0b1 を使用してください。ベータ版ではありますが、安定しており、修正が含まれ、PyTorch 2 をサポートし、高度な量子化ツールを提供しています。 exporters は、テキスト生成タスクを変換する際、出力に softmax を適用しなくなりました。これは、一部の生成アルゴリズムに必要だったためです。 exporters は現在、テキストモデルに対して固定シーケンス長を使用することをデフォルトとしています。フレキシブルな形状(flexible shapes)は CPU でしか動作せず、GPU や Neural Engine では動作しないため、GPU/Neural Engine で実行するには固定形状が必要です。
最適化
Core ML LLM の主要な最適化戦略には、キー・バリュー(key-value)ペアのキャッシュ、フレキシブルな入力の代わりに離散的な固定形状の使用、および 6-bit palettization や混合ビット量子化などの量子化技術の適用が含まれます。 キャッシュがないと、モデルはステップごとに全履歴に対してアテンション・スコアを再計算します。離散的な形状を使用することで、フレキシブルな入力による CPU 限定の制限を回避でき、キャッシュと組み合わせることで、より大きなコンテキストサイズが可能になります。量子化はモデルのサイズとリソース使用量を削減します。6-bit palettization と混合ビット量子化は、有望なアプローチとして強調されています。
swift-transformers
swift-transformers パッケージは、増加し続けるモデルセットに対して、Swift ネイティブの tokenizers モジュール、Hub 認識のモデルラッパー、および基本的な生成アルゴリズム(greedy および top-k サンプリング)を提供します。
Tokenizers
トークン化は、テキストをモデルが利用可能な ID に変換し、その逆を行います。swift-transformers は現在、GPT、Falcon、Llama モデルで使用されている BPE tokenizer をサポートしており、Hugging Face の tokenizers ライブラリを反映したコードになっています。 使用例:
import Tokenizers
func testTokenizer() async throws {
let tokenizer = try await AutoTokenizer.from(pretrained: "pcuenq/Llama-2-7b-chat-coreml")
let inputIds = try await tokenizer("Today she took a train to the West")
assert(inputIds == [1, 20628, 1183, 3614, 263, 7945, 304, 278, 3122])
}
Model and Hub wrappers
シンプルな LanguageModel プロトコルが、テキスト生成のために Core ML モデルをラップします。Hub モジュールは、変換中に Core ML モデルに追加されたカスタムメタデータフィールドを使用して、Hub から tokenizer と設定ファイルをダウンロードします(これは exporters と Space によって自動的に追加されます)。
Generation Algorithms
2 つのデコーディング戦略が実装されています:greedy decoding(常に最も確率の高いトークンを選択)と top-k sampling(最も可能性の高い k 個のトークンからランダムにサンプリングし、temperature で変動を制御)です。nucleus sampling などの追加メソッドも計画されています。
サポートされているモデル
これまでに、このパッケージは Llama 2、Falcon、StarCoder (GPT のバリアント)、および GPT2、distilgpt、GPT-NeoX、GPT-J を含む GPT ファミリーでテストされています。
swift-chat
swift-chat デモアプリは、swift-transformers を Swift プロジェクトに統合する方法を示しており、Hub から Core ML モデルをロードし、自動メタデータダウンロードを伴うテキスト生成を実行します。 モデルを選択した後、アプリは必要な設定ファイルをダウンロードし、Core ML を介してモデルをコンパイルし(結果をキャッシュ)、生成を実行します。UI は意図的にシンプルに設計されており、システムプロンプトなどの機能はまだサポートされていません。
不足している部分 / 次の予定
今後の作業として、エンコーダー・デコーダーモデルのサポート、Unigram および WordPiece tokenizer、追加の生成戦略、キー・バリューキャッシュ、およびより大きなコンテキストのための離散形状変換が追加される予定です。 チームは、issue、プルリクエスト、またはリポジトリへのフィードバックを通じた貢献を歓迎しています。
結論
これらのツールは、Swift 開発者が Apple アプリにオンデバイス LLM を導入するための出発点を提供し、チームはそれらを改善するためのコミュニティの貢献を求めています。