GpuGeek算力市場を開きます。アドレスは以下の通りです。
https://gpugeek.com/login?type=register&source=wechat_DLNLP_01
最も魅力的なのはRTX-A5000-24Gグラフィックカードで、1時間あたりわずか0.88元です。友人もあまりの安さに驚いていました。
RTX-A5000-24Gというモデルがなぜこんなに安いのか、以前から4090や3090グラフィックカードをよく使っていましたが、同レベルの24GBグラフィックカードでこの価格はただでもらえるようなものではないかと疑問に思いました。
筆者が調べてみたところ、A5000はコストパフォーマンスが非常に高いことがわかりました!
A5000は強力なグラフィックコアとマルチストリームプロセッサを搭載し、超並列計算能力を誇ります。単精度浮動小数点性能は27.8 TFLOPS、メモリ帯域幅は768 GB/sに達します。
このグラフィックカードは、NVIDIA RTX 3090の性能の80%に達するだけでなく、価格は3090のわずか66%です。線形回帰や主成分分析など、行列操作を頻繁に含むアルゴリズムでは、計算効率が直線的に向上し、アルゴリズムエンジニアがモデルをより迅速にイテレートするのを助けます。イメージとネットワーク高速化機能を組み合わせることで、より多くのアプリケーションシナリオに対応できます。以下は主要なパラメータの比較です:
こんなに安いので、これを使ってminimindプロジェクトを再現します。このオープンソースプロジェクトは、完全にゼロから、わずか3元のコストと2時間で、25.8Mの超小型言語モデルMiniMindをトレーニングすることを目的としています。
プロジェクトアドレス:https://github.com/jingyaogong/minimind
PS: 今回のトレーニングパラメータは非常に小さいため、今回のトレーニングは大規模モデルのトレーニングプロセス全体に焦点を当てています。そのため、性能については現時点では大きな期待はしていません。最後にモデルの効果をテストします。
これで背景説明は終わりです。さあ、袖をまくって始めましょう。小さなパラメータの「大規模モデル」をゼロからトレーニングします!
GPUインスタンスの作成
まず、GpuGeekアカウントを作成する必要があります。公式サイトのアドレスはhttps://gpugeek.com/login?type=register&source=wechat_DLNLP_01です。ただし、実名認証が必要です。新規ユーザーには特典があるかもしれませんが、ここでは詳しく述べません。
ナビゲーションバーの「コンソール」をクリックし、次に「インスタンスの作成」をクリックします。
次に、作成ページに進みます。ここで構成を自由に選択できます。私たちは直接RTX-A5000-24Gグラフィックカードを選択し、価格に問題がなければ作成できます。
作成後、左側のコンテナインスタンスインターフェースでインスタンスの操作方法を確認できます。
ここでは、sshやjupyterlabなど、複数のログイン方法がサポートされています。
「その他」をクリックすると、コンテナに対してさらに多くの操作を実行できます。
さらに、データディスクの拡張が非常に安価であるという特典を見つけました。以下は100GBの価格で、1日あたり1元未満、これはクレイジーです!
私は100GBに拡張しました。これにより、後続のデータとモデルの正常な保存が保証されます。次にモデルのトレーニングを開始します。インスタンスができた後、次のステップはデータセットをダウンロードすることです。
MiniMindトレーニングデータセットのダウンロード
MiniMindプロジェクトは、大規模モデルの事前学習、ファインチューニング、強化学習のすべてのデータセットをオープンソース化しており、大規模データセットを自分で前処理する手間を省き、反復的なデータ処理作業を回避できます。
データセットのアドレス:
https://www.modelscope.cn/datasets/gongjy/minimind_dataset/summary
以下は各データセットの簡単な説明です。
dpo.jsonl --RLHFフェーズデータセット
lora_identity.jsonl --自己認識データセット(例:あなたは誰ですか?私はminimindです...)、LoRAトレーニングに推奨(全パラメータSFTにも使用可能、名前に惑わされないでください)
lora_medical.jsonl --医療Q&Aデータセット、LoRAトレーニングに推奨(全パラメータSFTにも使用可能、名前に惑わされないでください)
pretrain_hq.jsonl ✨ --事前学習データセット、jiangshuテクノロジーから統合
r1_mix_1024.jsonl --DeepSeek-R1-1.5B蒸留データ、各データエントリの最大文字長は1024(したがって、トレーニング時にmax_seq_len=1024に設定)
sft_1024.jsonl --Qwen2.5蒸留データから統合(sft_2048のサブセット)、各データエントリの最大文字長は1024(したがって、トレーニング時にmax_seq_len=1024に設定)
sft_2048.jsonl --Qwen2.5蒸留データから統合、各データエントリの最大文字長は2048(したがって、トレーニング時にmax_seq_len=2048に設定)
sft_512.jsonl --匠数科技SFTデータから統合、各データエントリの最大文字長は512(したがって、トレーニング時にmax_seq_len=512に設定)
sft_mini_512.jsonl ✨ --匠数科技SFTデータ+Qwen2.5蒸留データからの最小限の統合(Zeroモデルの迅速なトレーニング用)、各データエントリの最大文字長は512(したがって、トレーニング時にmax_seq_len=512に設定)
tokenizer_train.jsonl --すべて匠数大規模モデルデータセットからのものです。この部分は比較的重要性は低いです(上記の理由から自分でトークナイザーを再トレーニングすることは推奨されません)。自分でトークナイザーをトレーニングする必要がある場合は、自由にデータセットを選択できます。
以下は、大規模モデルのトレーニングの各段階で使用されるデータセットの概略図です。これは実際には組み合わせのプロセスです。なぜこのような順序と組み合わせが選ばれているのか、皆さんも考えてみてください。
ModelScopeのSDKを使用してデータセットをダウンロードします。
ダウンロードする前に、以下のコマンドでModelScopeをインストールしてください。
pip install modelscope
完全なデータセットをダウンロードします。
cd /gz-data # データディスクディレクトリ
modelscope download --dataset gongjy/minimind_dataset --local_dir minimind_dataset
GpuGeekのネットワーク速度は非常に速いです。以下はデータセットのダウンロード速度の概略図です。素晴らしいので、もうネットワーク速度の心配はありません!
ダウンロード後、ファイルサイズが正常かどうかを確認します。
次に、minimindプロジェクトのコードをダウンロードし、トレーニングに進みます。ダウンロードコマンドは以下の通りです。
git clone https://ghfast.top/https://github.com/jingyaogong/minimind
https://ghfast.top/ このアドレスはGitHubのダウンロードを高速化するためのもので、中国国内でのGitHubダウンロードはネットワーク問題が発生する可能性があります。
環境準備
cd minimind
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
ここに落とし穴があります。バージョン番号を削除しないと、ほとんどの場合インストールに失敗します!
事前にTorchがcudaを使用できるかテストします。
import torch
print(torch.cuda.is_available())
すべてのデータセットファイルをコードディレクトリ下のdatasetに移動します。
大規模モデルの事前学習 - 知識を学ぶ
トレーニングコードはtrainerディレクトリにあります。この小さなパラメータのモデルはシングルカードで実行できるため、コードは比較的明確で複雑ではありません。基本的に、単一のスクリプトで対応するトレーニングを完了できます。これらのソースコードは、初心者にとって大規模モデルのトレーニングプロセス全体を理解するのに非常に適していると思います。
cd trainer
python train_pretrain.py
事前学習を実行し、事前学習の出力重みとしてpretrain_*.pthを取得します(*はモデルの次元で、デフォルトは512)。
大規模モデルの命令ファインチューニング - 対話を学ぶ
python train_full_sft.py
教師ありファインチューニングを実行し、命令ファインチューニングの出力重みとしてfull_sft_*.pthを取得します(fullは全パラメータファインチューニングを意味します)。
大規模モデルの強化学習 - 好みを学ぶ
python train_dpo.py
推論モデルのトレーニング
データセットのソースは上記で紹介しました。データ形式の例:
{"conversations": [{"role":"user","content":"こんにちは、私は小芳です。お会いできて嬉しいです。"}, {"role":"assistant","content":"
推論モデルR1の返信テンプレートは以下の通りです:
これはGRPOで、ルール報酬関数を設定することにより、モデルが思考タグと返信タグに準拠するように制約します(コールドスタートの初期段階では報酬値を高めるべきです)。
もう一つの問題は、蒸留プロセスはSFTと同じですが、実験結果ではモデルが毎回テンプレートの規範に準拠した返信をすることが困難であることです。つまり、思考タグと返信タグの制約から逸脱してしまうということです。ここでの小さなコツは、マークされた位置トークンの損失ペナルティを増やすことです。詳細はtrain_distill_reason.pyを参照してください:
# sp_idsに対応する位置に余分なペナルティを追加...loss_mask[sp_ids] = 10 # ペナルティ係数
詳細については、以下を参照してください。
https://github.com/jingyaogong/minimind
トレーニング後、outディレクトリに4つのモデル重みが得られます。
モデルのテスト
最後に、eval_model.pyスクリプトを使用してモデルの効果をテストできます。
これで大成功です。トレーニングされたモデルが質問に答えることができることがわかりますが、いくつかのケースをテストすると、回答がかなり短いことがわかりました。これはモデルのパラメータと大きく関係しています。
最後に、皆さんがソースコードを読んで、その背後にある原理と実装プロセスを学ぶことをお勧めします。以下にMiniMindモデルの結果セクションのコードの一部を貼り付けます。
このコードは、Transformerアーキテクチャに基づき、Mixture-of-Experts (MoE) 機能を備えたMiniMindという言語モデルを実装しています。主要なコンポーネントの簡単な要約は以下の通りです:
1. 設定クラス (MiniMindConfig)
隠れ層のサイズ、アテンションヘッドの数、層の数など、モデルの基本パラメータを定義します。
MoE (Mixture-of-Experts) システムの設定パラメータ(エキスパートの数、トークンごとに選択されるエキスパートの数など)を含みます。
2. 基本モジュール
RMSNorm: Root Mean Square正規化を実装しています。
回転位置埋め込み: 位置情報のエンコーディング (RoPE - Rotary Position Embedding) を実装しています。
アテンションメカニズム (Attention): マルチヘッド自己アテンションの実装を含み、Flash Attention最適化をサポートしています。
3. フィードフォワードネットワーク
FeedForward: SwiGLU活性化関数を含む従来のフィードフォワードネットワークの実装です。
MOEFeedForward: Mixture-of-Expertsフィードフォワードネットワークの実装です。
MoEGate: エキスパート選択ゲートメカニズムです。
4. モデル構造
MiniMindBlock: モデルの主要な構築ブロックで、自己アテンションとフィードフォワードネットワークを含みます。
MiniMindModel: 複数のBlockを結合して完全なエンコーダを形成します。
MiniMindForCausalLM: 因果言語モデリングに最終的に使用されるモデルで、デコーディングヘッドを含みます。
主な特徴は以下の通りです:
1. Mixture-of-Experts (MoE)
各トークンに対してエキスパートネットワークを動的に選択することを可能にします。
ゲートメカニズムを使用して、各トークンがどのエキスパートによって処理されるべきかを決定します。
エキスパートの使用をバランスさせるための補助損失関数をサポートします。
2. 最適化された実装
アテンション計算を高速化するためのFlash Attentionをサポートします。
推論高速化のための効率的なKVキャッシングメカニズム。
推論向けのエキスパートシステム最適化。
3. Hugging Faceエコシステムとの統合
PreTrainedModelおよびGenerationMixinを継承しています。
Hugging Faceのモデルロードおよび生成インターフェースと互換性があります。
モデルの実行フローは以下の通りです:
1. 入力トークンがベクトルとして埋め込まれます。
2. 複数のTransformerブロックを介して処理されます。
3. 各ブロックには自己アテンションとフィードフォワードネットワーク(通常またはMoE)が含まれます。
4. 最後に、言語モデルヘッドを介して出力語彙分布が生成されます。
この実装は、軽量でありながらフル機能の言語モデルフレームワークを提供し、特にMixture-of-Expertsシステムを通じて、パラメータ効率を維持しながらモデル容量を強化します。
モデルトレーニング部分のソースコードをさらに読むことをお勧めします。