数学やニューラルネットワークについてほとんど知らない人によって錆びた言語モデルへのRWKVアプローチの例。初期バージョンは、驚くべき情報とPythonの例に非常に大きく基づいていました:https://johanwind.github.io/2023/03/23/rwkv_details.html
また、RWKV Creatorのリポジトリ:https://github.com/blinkdl/chatrwkv/を参照してください。
32ビットモードでロードすると、多くのメモリが使用されます。 3Bモデルは約11GBのRAMを使用し、7Bは他のアプリケーションを閉鎖したり、スワッピングに対処することをいとわない32GBマシンに適合する場合があります。 8ビットモードでロードすることで、かなりの量のメモリを使用しますが、読み込みが完了するとドロップダウンします。
錆と貨物のセットアップが必要です:https://www.rustlang.org/learn/get-started
RWKVモデルをダウンロードする必要があります。開始するためのリンク(約820MB):https://huggingface.co/blinkdl/rwkv-4-pile-430m/resolve/main/rwkv-4-pile-430m-2022080808-8066.pth
また、トークンザー:https://github.com/blinkdl/chatrwkv/blob/main/20b_tokenizer.json
Pytorchモデルファイルは直接読み込むことができます。ファイルが.ptまたは.pthで終了すると、pytorchモデルとしてロードされます。 .stまたは.safetensorsで終了する場合、セーフテンサーとしてロードされます。注:Pytorchサポートは現在実験的であり、正しく機能しない場合があります。問題がある場合はすぐにエラーが発生する可能性があるため、そのアプローチを試すのは危険ではないはずです。必要に応じて、 torch機能を無効にし、Safetensorsフォーマットファイルのサポートのみを構築できます。
その後、あなたはただcargo run --release 。 --releaseなしでコンパイルを試してみることができますが、すべてがめちゃくちゃ遅くなる可能性があります。また、コマンドラインオプションを表示するために、 cargo run --release -- --helpを試してください。
注:デフォルトはすべての論理コアを使用することです。コマンドラインオプションを参照してください。
オプションで.pthモデルファイルをSafetensors形式に変換できます。例についてはutils/pth_to_safetensors.pyをご覧ください。これを行うには、 safetensorsとtorch Pythonパッケージをセットアップする必要があります。仮想環境でこれを行うことをお勧めします。現在、トーチファイルを現在のバージョンに直接ロードできるため、このステップにはあまり利点がありません。
GGMLサポートには現在llama-rsプロジェクトのggmlおよびggml-sysのパッチバージョンが必要です。
Cargo.tomlは、私のフォークの正しい枝を指すように設定されていますが、これは必要な変更がGGMLに統合されると消えます。当然、このレポは更新されますが、古いバージョンを使用しようとしている場合、最終的にそのブランチが削除されるため、コンパイルが最終的に失敗する可能性があることに留意してください。
注:この部分は今、時代遅れです。ただし、以下のリンクを読むことをお勧めします。また、その説明は、レイヤーごとに4つの状態しかないRWKVモデルのより単純なバージョンに基づいていることに注意してください。フルバージョンには5つあります。
モデルの評価に伴う手順の(おそらく間違った)高レベルの説明を次に示します。 smolrwkv/src/simple/model.rsのソースを参照する必要があります。これは理にかなっています。
また、これらを最初に読むことを強く検討してください。
ちなみに、楽しい事実:「テンソル」は本当に空想に聞こえますが、基本的には単なる配列です。 1次元テンソルは1次元配列にすぎず、2次元の次元テンソルは2次元配列です。特別な特性を持つことができます(不変であるなど)が、それは一般的に概念を理解することでは問題ではありません。配列がわかっている場合、テンソルの一般的なアイデアがすでにあります。
トークンを評価するには:
ln0からxの初期値を計算します。x各レイヤーに順番に送り、 xを使用して次のレイヤーに生成されたレイヤーを使用します。xを取ります。ln1をxに適用し、時間の混合に供給します。これは、モデルのFFN部分からのテンソルを使用します。tm_stateを取り、 last_xと呼びます。 (なぜ?誰が知っている!)tm_numとtm_den last_num 、 last_denとして使用します。tm_[state,num,den]の新しい値を計算したため、これらのレイヤー状態を更新します。xを返します。x x ( x += time_mixing_x )に追加します。ln2をxに適用し、チャネル混合に送ってください。これは、モデルのフィードフォワードネットワーク部分からのテンソルを使用します。cm_stateを取り、それをlast_x呼びます。cm_stateが計算されるため、レイヤー状態を更新します。xを返します。x xに追加します。xに派手な数学のものを実行します。モデルには、「知っている」トークンのリストがあります。トークンは単語に等しい場合があり、時には単語の一部にすぎません。通常、30,000〜60,000の範囲の多くのトークンがあります。現在のRWKVモデルには50,277トークンがあると思います。とにかく、モデルを実行した後、50,277のフローティングポイント番号のリストを取得します。
そのリストからの最高の値は、モデルが予測するトークンです。最も可能性の高い継続などです。トップ10-40程度のトークン確率のソートされたリストを生成し、ランダムに選択した場合、比較的言えば、かなり妥当な出力を取得します。 430mの小さなモデルは、一般的に最も合理的な出力を生成しないと言うのは公平です。
確率のリストが得られたら、次のステップを処理する方法の良い説明:https://huggingface.co/blog/how-to-generate
モデルの評価にはさまざまな複雑な数学が関係していますが、実際に重要なのはマトリックスの乗算(ソースのpardot )だけです。 RWKVの場合、マトリックスベクトル乗算(2D配列に1D配列を掛けた)です。モデルの評価に費やされた時間の90%がこれらのマトリックス増殖呼び出しにあります。
非GGMLモードでは、ここでの数学/配列の取り扱いはndarrayクレートを使用します。 .dot関数を提供しますが、クレートがスレッドサポートを主張している場合でも、これは実際にマトリックスベクトルの乗算を並行して計算することはありません。この計算はパフォーマンスにとって非常に重要であるため、計算をチャンクに分割して並行して実行するために独自の関数を書くことになりました。 smolrwkv/src/util.rsのdumdotモジュールの関数を参照してください。
あなたが確率のリストを取得し、モデルからの明確な「答え」を取得しないという事実は、LLMが何らかの形で意識している、または何らかの方法で意識している可能性があるという考えのまともな反論のように思えます。 LLMからの出力を見ると、多くの場合、最も可能性の高いトークンを見ることさえできません。また、面白い事実:モデルにプロンプトをフィードすると、応答を求めているときのように確率のリストが表示されます。ただし、これらの確率は、最後のプロンプトトークンを処理した後の結果を除いて捨てられます。
太字のプロンプト。ドラゴンの木はヘビですか、それとも犬ですか?世界は決して知らないかもしれません!
* Loading tokenizer from: ./20B_tokenizer.json
* Loading model from: ./RWKV-4-Pile-430M-20220808-8066.safetensors
* Discovering model structure.
- Loading layer 1/24
[...]
- Loading layer 24/24
* Loading non-layer tensors.
* Loaded: layers=24, embed=1024, vocab=50277
衝撃的な発見の中で、科学者は、チベットの遠隔地で未開拓の谷に住んでいるドラゴンの群れを発見しました。研究者にとってさらに驚くべきことは、ドラゴンが完璧な中国語を話したという事実でした。
これらのドラゴンはすべて異なる方言を話し、これらの方言は犬の母国語と一致しませんでした。
これらのドラゴンが話したことを解読するために、彼らはドラゴンを呼び、彼らの言語は人間とは異なることを発見しました。
「ドラゴンは人間の言葉を理解し、より正確には人間の言語を理解していました。ドラゴンは人間の言語を話しました。彼らはまた、中国語のルールを理解していました」と研究チームはモンガベイに語った。
研究を行うことにより、彼らは世界の遠隔地の遠隔地、特にチベットのドラゴンの神秘的な歴史に光を当てたいと思っています。
Journal Open Scienceに掲載された研究プロジェクトは、ドラゴンが実際に爬虫類、または別名ツリーヘビであることも示しています。
ドラゴン、ヘビではありません
調査チームによると、チベットで見つかったドラゴンは爬虫類ではなく犬の種族です。
研究チームは、これらのドラゴンがチベットに住んでいる理由についてまだ説明を思い付くことができませんでしたが、以前はチベット高原の近くの土地に存在する可能性が高いと信じられていました。
「ドラゴンズは、ほぼ完全に邪魔されず、青島全体のプラトー全体が徐々に農業状態に変換されていた偉大な青島 - ティベット高原の一部としてそこに住んでいます。したがって、彼らは木に噛むことの特徴的なパターンを持っています。