4G メモリを備えた Android 上で Alpaca を実行します。軽量 LLM モデル推論フレームワークである InferLLM を試してみましょう。

LLMの人気以来、コミュニティには数多くの優れたモデルが登場していますが、その最大の特徴はもちろんその大きなサイズです。最近、コミュニティは大規模なモデルをローエンド デバイスで実行できるようにするために多くの作業を行っています。gptq はモデルの低ビット量子化を実現し、CPU メモリと GPU メモリ上で大規模なモデルを実行するための要件を軽減します。llama. cpp は実現します。大規模なモデルはローカル CPU/GPU で実行でき、手順は非常に簡単です。replit-code-v1-3b は、小規模なモデルでよりスマートなコード生成を実現します。小型軽量化は大型モデルの開発方向でもあることが分かります。

これを考慮して、MegEngine チームは次の 2 つの主な目的を持って InferLLM プロジェクトを開発しました。

  • llama.cpp よりもシンプルで使いやすいローカル展開フレームワークを提供し、誰もが学び、議論できるようにします。

  • LLM モデルをローカルまたはエンドにデプロイできるようにし、将来的には実際の運用環境で使用できるようにします。

llama.cpp プロジェクトと比較して、InferLLM はより単純な構造を持ち、すべてのロジック コードとカーネル コードを 1 つのファイルに入れることを避け、コードの読み取りと開発に影響を与えるほど多くのマクロをカーネルに導入することを避けるために、いくつかの共通コンポーネントをリファクタリングしています。学習や二次開発にはあまりフレンドリーではありません。InferLLM はまた、llama.cpp のモデル形式を使用し、いくつかの計算されたコードをコピーするなど、主に llama.cpp を利用します。同時に、InferLLM はそれをリファクタリングしてコードを作成します。よりシンプルでわかりやすく、非常に使いやすく、フレームワーク コードはカーネル コードから分離されています。実際、大規模なモデル推論では、実際に最適化する必要があるカーネルは CNN のカーネルよりもはるかに小さいです。

さらに、InferLLM は、平均的なパフォーマンスの携帯電話上で LLM 量子化モデルをスムーズに実行でき、人間と機械の対話をスムーズに行うことができるため、運用環境でも使用できます。 、約4Gのメモリのみが必要ですが、このメモリは現在ほとんどの携帯電話に十分です。近い将来、大規模モデルの中に軽量モデルが多数登場し、最終的にデプロイして直接推論できるようになるだろうと私は信じています。結局のところ、携帯電話は誰にとっても最も簡単に利用できるコンピューティング リソースであり、無駄にする理由はありません。それほど巨大なコンピューティングクラスターです。

以下は、4 スレッドの xiaomi9、Qualcomm SM8150 Snapdragon 855 で中国のアルパカ 7b 4 ビット量子化モデルを実行する場合です。

37f55f4ad5d846edbef7af7729ab7c47.gif

InferLLM は主に次のいくつかの部分で構成されます。

  • モデル: 主に入力トークナイザー、語彙管理、いくつかの履歴トークンの保存とデコーダー後のサンプリングなどを担当します。

  • Graph/Op: モデル内の Op の直接接続関係、Op の実行、Op の入出力などのメモリ リソースの管理を含む、モデル全体の作成を担当します。

  • カーネル: 現在 x86、Arm、および naive を含む、さまざまなバックエンドに最適化されたカーネルを提供します。x86 および Arm に最適化されたカーネルがない場合、naive で実行するように直接フォールバックされます。

InferLLM は主に次の機能をサポートします。

  • 各 Op の実行前のリソースの準備をサポートしており、各 Op は実行前に pre_execute を呼び出し、実行後に end_execute を呼び出す必要があります。このように、メモリが不足しているデバイスで実行する前に、ディスクの中央から重みを RAM に読み取り、実行完了後に重みをディスクに保存すると便利です。また、mmap を直接使用して、オペレーティング システムはこれらのロジックを自動的に処理します。

  • 各マルチヘッド アテンションの KV キャッシュをサポートし、計算された各キーと値は KVStorage に保存されます。KVStorage はトークン ID のインデックス付けをサポートし、KV キャッシュが大きすぎる場合はスワップアウトもサポートします。

  • CPU、SIMD、量子化、float16 計算、その他の高速化メソッドでのマルチスレッドのサポート マルチスレッドは、ロックフリーのスレッド プールを使用して複数のスレッド間で同期する、OpenMP の静的スケジューリング自体が実装されているのと同様のロジックです。

  • さまざまなモデル形式と互換性があり、現在はラマのようなモデルのみをサポートしていますが、将来的にはより多くのモデル構造をサポートする予定です。

皆さんも InferLLM を試してみてください: https://github.com/MegEngine/InferLLM

添付ファイル: MegEngine に関する詳細情報を取得するには、ドキュメントと GitHub プロジェクトを表示するか、MegEngine ユーザー コミュニケーション QQ グループ (1029741705) に参加してください。MegEngine コミュニティに貢献して、Awesome MegEngineer になり、無限の名誉証明書とカスタマイズされたギフトをお楽しみください。

9e60f78c394c07ab9eecdee9e86fa2c7.gif

おすすめ

転載: blog.csdn.net/Megvii_tech/article/details/130612829