English Deutsch
preview
独自のLLMをEAに統合する(第4部):GPUを使った独自のLLMの訓練

独自のLLMをEAに統合する(第4部):GPUを使った独自のLLMの訓練

MetaTrader 5トレーディング | 13 8月 2024, 10:53
40 0
Yuqiang Pan
Yuqiang Pan

目次



はじめに

前回は、大規模言語モデル用のデータセットの作成方法について簡単に説明し、簡単な例を使ってCPUだけで言語モデルを訓練する方法を実演しました。しかし、実際のところ、このモデルは訓練済みのモデルに過ぎないため、テストはおこないませんでした。この記事では、モデル訓練についての議論を続け、今回はGPUを使ってプロセスを加速させます。デモの例として、このモデルはまだ十分に強力ではないことに注意することが重要です。そのため、この記事ではモデルのテストについては説明しません。テストについては、次回の記事で取り上げます。  

本連載の第2回では、CUDAアクセラレーション環境の設定について説明しました。今回は、前回の記事の補足として、AMDグラフィックカードを使用した訓練の高速化に焦点を当てます。現在、NVIDIAグラフィックスカードの環境構築は比較的簡単ですが、AMDカードの環境構築にはさまざまな課題があります。この記事では、よくある問題の解決策を提供し、AMDグラフィックスカードを使用して独自の金融言語モデルの訓練をスムーズに加速できるようにします。NVIDIAのグラフィックカードを使用している場合でも、訓練方法は同じですのでご安心ください。CUDA環境の設定が済んでいれば、AMDカードに特化した設定ステップに集中することなく、この記事で提供される訓練手順に従うことができます。  

準備はいいですか。 


準備

本連載の前回の記事では、NVIDIA環境の設定について説明しました。しかし、AMDのハードウェアを使っているユーザーもいるという事実を見落としてはなりません。そこで、ROCm (Radeon Open Compute)アクセラレーションコンピューティング環境の設定についても説明します。今のところ、ROCmをサポートしたWindows用のPyTorchバージョンはなく、WSL (Windows Subsystem for Linux)もまだROCmをサポートしていません。そのため、大規模なモデルの訓練にROCmを使用したい場合、現在のところLinux(特にUbuntu)が有力な選択肢となります(ポジティブな点として、将来的にROCmの次のリリースではWSLがサポートされるかもしれませんが、現在の最新バージョンは6.1.2であり、最初にサポートされるバージョンが最適化されるとは思いません)。私の使用中、NVIDIAでは直面しなかったAMDハードウェアに関するいくつかの問題に遭遇しました。AMDユーザーに役立つと思われる解決策をいくつか紹介しましょう。少し面倒かもしれませんが、お金を節約していることを忘れないでください。あはは...  

AMDグラフィックスカードを使って大規模言語モデルの訓練を高速化したい場合、必要な準備を紹介しましょう。     

1. Ubuntuのインストール  

Ubuntuシステムをインストールする必要があります。同じPCにWindowsとUbuntuのデュアルブートシステムを設定することは可能であり、推奨されます。Windowsシステムからデータにアクセスする必要があるかもしれないので、両方のOSオプションがあると便利です。デュアルブートシステムを設定するための詳細なチュートリアルは、オンラインで広く公開されています。あるいは、AMDデバイスをリモートUbuntuホストとしてデプロイし、リモート開発環境として使用することもできます。その後、WindowsシステムからSSH経由でリモートホストに接続できます。この方法は、WindowsでWSLを使用するのと似ていますが、AMDグラフィックカードがWSLをサポートしていない点が大きく異なります。この件についてROCmの開発者に尋ねたところ、WSLサポートは現在開発中である(次のバージョンで利用できる可能性がある)とのことでした。ただし、このソリューションでは複数のコンピュータが必要になる可能性があることを覚えておいてください。私は個人的にはこの方法を使っています。  

2. ハードウェア構成のチェック  

ハードウェアの構成は慎重におこなってください。例えば、7900XTXグラフィックカードで頻繁にドライバがクラッシュました。当初850Wの電源を使用しており、これはシングルGPUには十分なはずでした。ドライバのクラッシュが電源の問題に関係しているとは考えませんでした。さまざまな解決策を試しましたがうまくいかず、友人が1250W電源へのアップグレードを勧めてくれて、すべてがスムーズに実行されるようになりました。

というわけで、AMDのハードウェアユーザー全員に心からのアドバイスです。電源がお使いの機器に対応していることを確認してください。  

3. ROCMとHIP   

あまり複雑な環境設定を必要としない場合は、AMDの公式Dockerイメージを使用することができます。Dockerを使ってROCmの公式コンテナイメージを取り込むだけです。必要な環境設定のほとんどは、Dockerイメージですでに設定されています。それが、このアプローチをお勧めする理由です。

4. ハードウェア設定

デバイスの使用中に、UbuntuのAMDGPUドライバの最適化があまり良くないことに気づきました。私の7900XTXを例にとってみましょう。350Wの出力が可能ですが、デフォルトの上限は303Wに設定されています。さらに、全負荷時でもファンの回転数は45%未満で、コア温度は100℃を維持しました。数時間、あるいは数日間も連続運転するような大規模モデルの訓練では、このような高温を維持することは装置にとって危険です。  

ハードウェアデバイスを乗り換えたくなってきましたか。信じてください。これからです...。  


ハードウェア構成

1. ドライバの設定

これまでのところ、Ubuntuのamdgpuドライバは、GPU設定のための外部インターフェイスをいくつか提供しています。構成ファイルは、/sys/class/drm/card0/device/hwmon/hwmon2/にあります。hwmon2は、hwmon1または他の値である可能性があります。お使いのデバイスに応じて調整してください。ファンの回転数とパワーを適切に調整することをお勧めしますが、その他の設定は変更しないでください。  

ファンの回転数を設定する方法を説明しましょう。これらのファイル操作には管理者権限が必要で、そうでなければ変更を加えることができません。修正にはrootユーザーを使用することをお勧めします。    

  • まず、pwm1を有効にします。echo "1" > /sys/class/drm/card0/device/hwmon/hwmon2/pwm1_enable
  • 設定を適用します。 echo "c" > /sys/class/drm/card0/device/hwmon/hwmon2/pwm1_enable

ファンの回転数を128に設定します。値は0から255の範囲で設定でき、255はファンの回転数の最大値に相当します。

  • 必要に応じて調整してください。echo "128" > /sys/class/drm/card0/device/hwmon/hwmon2/pwm1
  • 設定を適用します。echo "c" > /sys/class/drm/card0/device/hwmon/hwmon2/pwm1     

電力制限を調整します。例えば、7900XTXの最大電力が350Wで、デフォルトが303Wの場合

  • 330Wに変更します。echo "330000000" > /sys/class/drm/card0/device/hwmon/hwmon2/power1_cap
  • 設定を適用します。 echo "c" > /sys/class/drm/card0/device/hwmon/hwmon2/power1_cap   

1. 設定を戻すには、「echo "r" >」の後に関連するパスを続けます(例:echo "r" > /sys/class/drm/card0/device/hwmon/hwmon2/pwm1_enable)。  

2. pwm1とfan[1-*]_targetインターフェイスの両方で同時にファンの回転数を設定することは避けてください。     

2. ROCM-SMIの設定

以下はrocm-smiでよく使われるコマンドです。 

usage: rocm-smi [-h] [-V] [-d DEVICE [DEVICE ...]] [--alldevices] [--showhw] [-a] [-i] [-v] [-e [EVENT ...]]
                [--showdriverversion] [--showtempgraph] [--showfwinfo [BLOCK ...]] [--showmclkrange] [--showmemvendor]
                [--showsclkrange] [--showproductname] [--showserial] [--showuniqueid] [--showvoltagerange] [--showbus]
                [--showpagesinfo] [--showpendingpages] [--showretiredpages] [--showunreservablepages] [-f] [-P] [-t]
                [-u] [--showmemuse] [--showvoltage] [-b] [-c] [-g] [-l] [-M] [-m] [-o] [-p] [-S] [-s]
                [--showmeminfo TYPE [TYPE ...]] [--showpids [VERBOSE]] [--showpidgpus [SHOWPIDGPUS ...]]
                [--showreplaycount] [--showrasinfo [SHOWRASINFO ...]] [--showvc] [--showxgmierr] [--showtopo]
                [--showtopoaccess] [--showtopoweight] [--showtopohops] [--showtopotype] [--showtoponuma]
                [--showenergycounter] [--shownodesbw] [--showcomputepartition] [--showmemorypartition] [-r]
                [--resetfans] [--resetprofile] [--resetpoweroverdrive] [--resetxgmierr] [--resetperfdeterminism]
                [--resetcomputepartition] [--resetmemorypartition] [--setclock TYPE LEVEL] [--setsclk LEVEL [LEVEL ...]]
                [--setmclk LEVEL [LEVEL ...]] [--setpcie LEVEL [LEVEL ...]] [--setslevel SCLKLEVEL SCLK SVOLT]
                [--setmlevel MCLKLEVEL MCLK MVOLT] [--setvc POINT SCLK SVOLT] [--setsrange SCLKMIN SCLKMAX]
                [--setextremum min|max sclk|mclk CLK] [--setmrange MCLKMIN MCLKMAX] [--setfan LEVEL]
                [--setperflevel LEVEL] [--setoverdrive %] [--setmemoverdrive %] [--setpoweroverdrive WATTS]
                [--setprofile SETPROFILE] [--setperfdeterminism SCLK]
                [--setcomputepartition {CPX,SPX,DPX,TPX,QPX,cpx,spx,dpx,tpx,qpx}]
                [--setmemorypartition {NPS1,NPS2,NPS4,NPS8,nps1,nps2,nps4,nps8}] [--rasenable BLOCK ERRTYPE]
                [--rasdisable BLOCK ERRTYPE] [--rasinject BLOCK] [--gpureset] [--load FILE | --save FILE]
                [--autorespond RESPONSE] [--loglevel LEVEL] [--json] [--csv]

オプションを設定します。
  --setclock TYPE LEVEL 指定したクロックのクロック周波数レベルを設定する(manual Perfレベルが必要)
  --setsclk LEVEL [LEVEL ...] GPUクロック周波数レベルを設定する(manual Perfレベルが必要)
  --setmclk LEVEL [LEVEL ...] GPUメモリクロック周波数レベルを設定する(manual Perfレベルが必要)
  --setpcie LEVEL [LEVEL ...] PCIEクロック周波数レベルを設定する(manual Perfレベルが必要)
  --setslevel SCLKLEVEL SCLK SVOLT 特定のレベルのGPUクロック周波数(MHz)と電圧(mV)を変更する
  --setmlevel MCLKLEVEL MCLK 特定のレベルのMVOLT GPUメモリのクロック周波数(MHz)と電圧(mV)を変更する
  --setvc POINT SCLK SVOLT 特定のポイントのSCLK電圧曲線(MHz mV)を変更する
  --setsrange SCLKMIN SCLKMAX SCLK速度の最小値と最大値を設定する
  --setextremum min|max sclk|mclk CLK SCLK/MCLK速度の最小値/最大値を設定する
  --MCLKMIN MCLKMAX MCLK速度の最小値と最大値を設定する
  --setfan LEVEL GPUファンの回転数を設定する(レベルまたは%)
  --setperflevel LEVEL パフォーマンスレベルを設定する
  --setoverdrive % GPU OverDriveレベルを設定する(manual|high Perfレベルが必要)
  --setmemoverdrive % GPU Memory Overclock OverDriveレベルを設定する(manual|high Perfレベルが必要)
  --setpoweroverdrive WATTS Power OverDriveを使用するGPUの最大電力をワットで設定する
  --setprofile SETPROFILE Power Profileレベル(#)またはCUSTOM Profile属性の引用符付き文字列(# # #...)を指定する(manual Perfレベルが必要)

  --setperfdeterminism SCLKパフォーマンスのばらつきを最小にするためのクロック周波数の上限を設定する

  --setcomputepartition {CPX,SPX,DPX,TPX,QPX,cpx,spx,dpx,tpx,qpx}  計算パーティションを設定する
  --setmemorypartition {NPS1,NPS2,NPS4,NPS8,NPS1,NPS2,NPS4,NPS8}   メモリパーティションを設定する
  --rasenable BLOCK ERRTYPE 指定したブロックとエラータイプのRASを有効にする
  --rasdisable BLOCK ERRTYPE 指定されたブロックとエラータイプのRASを無効にする
  --rasinject BLOCK 指定されたブロックにRASポイズンを注入する(安全でないボードでのみ動作)

リセットオプション:
  -r, --resetclocks クロックとOverDriveをデフォルトにリセットする
  --resetfans ファンを自動(ドライバ)制御にリセットする
  --resetprofile 電源プロファイルをデフォルトにリセットする
  --resetpoweroverdrive GPUの最大電力をデバイスのろう状態に戻す
  --resetxgmierr XGMIエラーカウントをリセットする
  --resetperfdeterminism パフォーマンス判定を無効にする
  --resetcomputepartition 起動時計算パーティションの状態にリセットする
  --resetmemorypartition 起動時メモリパーティションの状態にリセットする

自動応答のオプション:
  --autorespond RESPONSE すべてのプロンプトに対して自動的に応答する(非推奨)

出力オプション:
  --loglevel LEVEL プログラムの挙動についてどの程度出力されるか(debug/info/warning/error/criticalのいずれか)
  --json JSON形式で出力する
  --csv CSV形式で出力する

         

3. AMD-SMIの設定

現在のROCmの開発方向からすると、amd-smiがrocm-smiに取って代わる可能性はあります。以下はamd-smiでよく使われるコマンドです。 

usage: amd-smi set [-h] -g GPU [GPU ...] [-f %] [-l LEVEL] [-P SETPROFILE] [-d SCLKMAX]
                   [-C PARTITION] [-M PARTITION] [-o WATTS] [-p POLICY_ID] [-x POLICY_ID]
                   [--json | --csv] [--file FILE] [--loglevel LEVEL]

構成を設定するにはGPUを指定する必要があります。                                    
set引数(複数可)を指定する必要があります。

引数を設定します。
  -h, --help このヘルプメッセージを表示して終了する
  -g, --gpu GPU [GPU ...] GPU ID、BDF、UUIDを選択肢から選ぶ
  -f, --fan % GPUファンの回転数を設定する(0~255または0~100%)
  -l, --perf-level LEVEL パフォーマンスレベルを設定する
  -P, --profile SETPROFILE 電源プロファイルレベル(#)またはカスタムプロファイル属性の引用符付き文字列を設定する
  -d, --perf-determinism SCLKMAX GPUクロック周波数の上限と性能レベルを決定論に設定し、性能のばらつきを最小にする
  -C, --compute-partition PARTITION 計算パーティションモードを CPX、SPX、DPX、TPX、QPXのいずれかに設定する
  -M, --memory-partition PARTITION メモリパーティションモードをNPS1、NPS2、NPS4、NPS8のいずれかに設定する
  -o, --power-cap WATTS 電力容量の上限を設定する
  -p, --dpm-policy POLICY_ID ポリシーIDを使用してGPU DPMポリシーを設定する
  -x, --xgmi-plpd POLICY_ID ポリシーIDを使用して、GPU XGMIのリンクごとのパワーダウンポリシーを設定する

コマンド修飾子:
  --json JSON形式で出力を表示する(デフォルトでは人間が読める形式)
  --csv CSV形式で出力を表示する(デフォルトでは人間が読める形式)
  --file FILE 指定されたパスのファイル(デフォルトでは標準出力)に出力を保存する
  --loglevel LEVEL ロギングレベルを DEBUG、INFO、WARNING、 ERROR、CRITICALのいずれかに設定する

  

amd-smiを使用すると失敗するがrocm-smiを使用すると成功する設定もあります。例:「sudo amd-smi set -g 0 -f 90%」が失敗して、「ValueError:Unable to set fan speed 229 on GPU ID:0 BDF:0000:03:00.0」が表示された場合、「rocm-smi: sudo rocm-smi --setfan 90%」を使用すると、うまくいきます。


4. ハードウェア設定をサポートするソフトウェア

Ubuntuでは、UIベースの管理ツールも用意されています。本記事ではこれらについて詳しくは触れませんが、興味のあるユーザーは以下のオプションをご検討ください。  

LACT:https://github.com/ilya-zlobintsev/LACT

radeon-profile:https://github.com/marazmista/radeon-profile


開発環境

ハードウェアの設定が完了したら、GPUアクセラレーションのためにシステム上で以下の環境を設定する必要があります。AMDのデバイスを例にとって話を続けましょう。

  • アクセラレーテッドコンピューティング対応ドライバ:amdgpu DKMSドライバとROCm HIP SDKをインストールする必要があります。
  • アクセラレーテッドコンピューティング対応Pythonライブラリ:ROCmでコンパイルされたPyTorch。モデルに量子化が必要な場合は、bitsandbytes(ROCmでコンパイル)の使用を検討してください。アクセラレーテッドコンピューティングには、flash-attentionとtriton(どちらもROCmでコンパイル)が必要な場合があります。推論テストでは、vllmを使用することができます。この例では、PyTorchをインストールすれば十分です。

1. ドライバと依存関係のインストール

ハードウェアとシステムがROCmの最新バージョンに対応しているかどうかを確認してください。対応していない場合、以前のROCmバージョンを調べてみてください。もしお使いのデバイスに対応するバージョンがなければ、おめでとうございます。ついに AMDの苦しみから解放されます。お使いのデバイスがROCmに対応している場合、2つの選択肢があります。Docker roを使って環境をデプロイし、ローカルホストに直接インストールします。ローカルにインストールする場合も、Dockerコンテナ内にインストールする場合も、手順は似ています。Dockerを使用することを強くお勧めします。操作中にミスをした場合、コンテナを削除して、すでに引き出されているUbuntuイメージから新しいコンテナを実行するだけで、システムを再インストールする必要がありません。そこでこの記事では、Dockerを使用した開発環境のデプロイに焦点を当てます。Dockerをインストールする際は、(Docker Desktopではなく)Docker Engineを使用してください。https://docs.docker.com/engine/installのインストールガイドを参照してください。


2. ベースイメージをプルする

Ubuntu 22.04のベースイメージをプルします(docker pull ubuntu:22.04)。  

カスタマイズなしでデプロイする場合は、ROCm/PyTorchイメージを直接プルします(docker pull rocm/pytorch:latest)。

コンテナを実行します。

docker run -it --cap-add=SYS_PTRACE --security-opt seccomp=unconfined \
		--device=/dev/kfd --device=/dev/dri --group-add video \
		--ipc=host --network=host --shm-size 8G rocm/pytorch:latest

Dockerコンテナ内では、ほとんどの開発環境がすでに設定されています。llm.cをコンテナにコピーするか、Gitを使って公式リポジトリからクローンします。その後、モデルの訓練セクションに直接進みます。しかし、一般的でない問題に遭遇した場合、トラブルシューティングの方法がわからなくなります。そのため、段階を追ってデプロイすることで、どこに解決策があるのかが常にわかるようにすることがお勧めです。

3. コンテナの作成

以下のコマンドを実行してコンテナを作成します(必要に応じて別の名前を選択)。

docker run -it --name llmc --cap-add=SYS_PTRACE --ipc=host --network=host \
		--security-opt seccomp=unconfined --device=/dev/kfd --device=/dev/dri --group-add video ubuntu:22.04  

「--name llmc」はオプションです。これは、作成されるコンテナの名前をllmcとします。このパラメータを省略すると、コンテナの名前はランダムになります。   コンテナからホストへのネットワークアクセスを単純化するために、「--network=host」を使用することをお勧めします。そうしないと、デフォルトのネットワークモードがブリッジになり、コンテナからホストへのネットワークアクセス(ホストのネットワークプロキシへのアクセスなど)が複雑になります。「--ipc=host」を指定すると、コンテナはホストとメモリを共有するようになり、効率が向上します。しかし、安全性は低下します。ニーズに応じて使い分けてください。 


4. ドライバのインストールとROCmの設定    

必要なソフトウェアの依存関係をインストールします。ホスト上でインストールする場合は、コマンドの前にsudoを付けます。

apt install wget

apt install gpg

amdgpu APTリポジトリを設定します。

wget https://repo.radeon.com/rocm/rocm.gpg.key -O - | gpg --dearmor | tee /etc/apt/keyrings/rocm.gpg > /dev/null  

echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/rocm.gpg] https://repo.radeon.com/amdgpu/6.1.1/ubuntu jammy main" \    | tee /etc/apt/sources.list.d/amdgpu.list  

apt update  

echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/rocm.gpg] https://repo.radeon.com/rocm/apt/6.1.1 jammy main" \    | tee --append /etc/apt/sources.list.d/rocm.list  

echo -e 'Package: *\nPin: release o=repo.radeon.com\nPin-Priority: 600' \    | tee /etc/apt/preferences.d/rocm-pin-600  

apt update  

amdgpuドライバをインストールします。 

apt install amdgpu-dkms

ローカルホストにインストールしている場合は、システムを再起動します。

ROCmをインストールします(私はrocm-hip-sdkを選択しました)。  

apt install rocm-hip-sdk

もちろん、他の選択肢もあります。  

  • rocm:すべてのROCmコアパッケージ、ツール、ライブラリ
  • rocm-language-runtime:ROCmランタイム
  • rocm-developer-tools:HIPアプリケーションのデバッグとプロファイル
  • rocm-hip-runtime:AMDプラットフォーム用に書かれたHIPアプリケーションを実行
  • rocm-hip-runtime-devel:HIP上でアプリケーションを開発するか、CUDAから移植
  • rocm-opencl-runtime:AMDプラットフォーム上でOpenCLベースのアプリケーションを実行
  • rocm-opencl-sdk:AMDプラットフォーム用のOpenCLベースのアプリケーションを開発
  • rocm-hip-librarie:AMDプラットフォームに最適化されたHIPライブラリ
  • rocm-hip-sdk:AMDプラットフォーム用のHIPアプリケーションおよびライブラリを開発または移植
  • rocm-ml-libraries:主要な機械学習ライブラリ(MIOpenを含む)
  • rocm-ml-sdk:AMD用の機械学習アプリケーションを開発、実行
  • rocm-openmp-runtime:AMDプラットフォーム上でOpenMPベースのアプリケーションを実行
  • rocm-openmp-sdk:AMDソフトウェア用のOpenMPベースのアプリケーションを開発

インストール後、以下の環境変数を追加します。  

tee --append /etc/ld.so.conf.d/rocm.conf <<EOF

/opt/rocm/lib/opt/rocm/lib64EOF  

ldconfig

DKMSのステータスを確認します。

dkms status

PATH環境変数にバイナリパスを追加します。

export PATH=$PATH:/opt/rocm-6.1.1/bin

インストールを確認します(/opt/rocm-6.1.1/bin/rocminfo/opt/rocm-6.1.1/bin/clinfo)。  

5. PyTorchのインストール

Pythonがインストールされていない場合は、aptを使ってインストールするか、Conda (Miniconda)環境を設定します(apt install libjpeg-dev python3-dev python3-pip)。  

次に、PyTorchの公式Webサイトで、使用しているROCmのバージョンがサポートされているかどうかを確認します。現時点では、公式リリースはROCm 6.1.1をサポートしていないので、プレビュー版をインストールします。  

pip3 install --pre torch torchvision torchaudio --index-url https://download.pytorch.org/whl/nightly/rocm6.1/ 

トーチ

ご使用のROCmのバージョンが公式サポートバージョンより低い場合は、それに応じてインストールコマンドを調整してください。例えば、公式リリースコマンドが「pip3 install torch --index-url https://download.pytorch.org/whl/rocm6.0」で、ROCmのバージョンが「5.7.*」の場合、以下のようにインストールできます。  

pip3 install torch --index-url https://download.pytorch.org/whl/rocm5.7


「NameError: name 'amdsmi' is not defined」問題が発生した場合、原因は、新しいTorchのバージョンではPythonがamdsmiをサポートする必要があることです。残念ながら、pipを直接使ってもうまくいきません。ローカルでビルドしてインストールする必要があります。/opt/rocm/share/amd_smiに移動し、amd-smi-libをインストールします。  

apt install amd-smi-lib  

ホストのデフォルトのPythonバージョンにインストールする場合  

python3 -m pip install --user . 

次のようなパーミッションエラーが発生した場合  

error: Cannot update time stamp of directory 'amdsmi.egg-info'  

error: could not create 'amdsmi.egg-info': Permission denied  

root権限で以下のコマンドを実行します。  

sudo python3 -m pip install --user .  

Python3が見つからない場合は、以下を使用します。  

sudo -H python3 -m pip install --user .  

Conda環境(例えばtrain_llmという名前)を使っている場合は、以下のようにインストールします。  

sudo /home/deeper/miniconda/envs/train_llm/bin/python -m pip install . 

パスは特定の仮想環境のPythonパスに置き換えてください。

最後に再試行します。  

pip3 install --pre torch torchvision torchaudio --index-url https://download.pytorch.org/whl/nightly/rocm6.1/

  

モデルの訓練

前回に引き続き、オープンソースのllm.cプロジェクトを使用します。個人的には、このプロジェクトは素晴らしいと思います。コードのロジックは明確で、コメントも詳細で読みやすいです。興味のある読者は、このプロジェクトのソースコード全体を調べ、大規模言語モデルの訓練プロセス全体を明確に理解することができます。各訓練ステップのコードは、ソースコードのコメントですでにかなり明示されているので、ここでは繰り返しません。  

llm.cリポジトリをダウンロードするには、公式リポジトリを直接gitするのではなく、AMDデバイスをサポートするhttps://github.com/anthonix/llm.cプロジェクトを使用する必要があります。もし訓練に問題があったなら、私が使っているソースコードのバージョンに切り替えてみてください。現在私が使っているバージョンは「37dfcf6」です。

cd llm.c
git checkout 37dfcf6

バージョンを切り替える必要がある場合は、プロジェクトをgit cloneでダウンさせた後、以下のコマンドラインを使って切り替えます。

1. プロジェクトの依存関係をインストールする

まず、プロジェクトの依存関係をインストールします。  

pip install -r requirements.txt 

バージョンの衝突を避けるため、requirements.txtから依存関係をインストールする前に、まずTorchをインストールする必要があることに注意してください。

次に、プロジェクトをコンパイルします。  

make train_gpt2amd AMDGPU_TARGETS=gfx1100 

特定のISA(命令セットアーキテクチャ)を調べるには、rocminfoを使い、出力をgrepでフィルタリングします。  

rocminfo | grep Name:  

2. 訓練の準備

このステップはCPUでの訓練と似ているので、ここでは詳しく説明しません。包括的な説明が必要な場合は、前回の記事を参照してください。以下は訓練コマンドです。

データを入手します。

python data_enc

訓練を準備します。

python train_gpt2.py --input_bin data/val_data.bin

 「data/val_data.bin」をdata_encを実行したときの出力パスに置き換えます。   

次のコマンドを実行します。 

make train_gpt2amd AMDGPU_TARGETS=gfx1100  

この場合も、gfx1100をrocminfoから入手した特定のISAに置き換えてください。   

  

「fatal error: 'cmath' file not found」と表示された場合は、g++のバージョンが合っていない可能性があります。Ubuntuのいくつかのバージョンにはg++11が付属していますが、g++12は付属していません。g++12をインストールし、デフォルトバージョンに設定します。 

apt install g++-12  

update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 60 --slave /usr/bin/g++ g++ /usr/bin/g++-12 
「4 warnings generated when compiling for host.」を無視して、以下のコマンドを実行します。  
./train_gpt2amd  

最後のコマンドを実行すると、「[CUDA ERROR] at file build/hip/llmc/layernorm.cuh:400」でプログラムがクラッシュしました。この時点でAMDハードウェアを選んだことを後悔しているのなら、私を信じてください。これはほんの始まりに過ぎません。さらに多くの課題が待ち受けています。AMDハードウェアとの旅は始まったばかりです。  

うまく実行に移せれば上出来です。うまくいかなくてもくじけないでください。Pythonスクリプトを使ってモデルを訓練することができます。   

モデルを訓練するためにpythonスクリプトを使用して、次のコマンドを実行することができます。  

python train_gpt2.py \
    --input_bin "./data/train_data.bin" \
    --input_val_bin "./data/val_data.bin" \
    --val_loss_every 10 \
    --sample_every 0 \
    --output_dir pylog124M \
    --write_tensors 0 \
    --model d12 \
    --batch_size 16 \
    --sequence_length 128 \
    --total_batch_size 4096 \
    --dtype bfloat16 \
    --compile 1 \
    --tensorcores 1 \
    --flash 1 \
    --num_iterations 100 \
    --weight_decay 0.1 \
    --zero_stage 1 \
    --learning_rate 0.0006 \
    --warmup_iters 0 \
    --learning_rate_decay_frac 0.0 \
    --overfit_single_batch 0

ここで、いくつかのパラメータを挙げておきます。  

  • -input_bin "./data/train_data.bin" 訓練データセットを指定する
  • –input_val_bin "./data/val_data.bin" 検証データセットを指定する
  • -val_loss_every 10 特定のステップ数ごとに損失を表示する
  • -batch_size 16 この値は2の冪乗でないとエラーになります。テストしているだけであり、データセットは大きくないので、大きすぎる必要はありません
  • -sequence_length 128 この値は2の冪乗でないとエラーになります。データセットのシーケンス長は64なので、ここでは128としました 
  • –total_batch_size 4096 この値は2の冪乗でないとエラーになります。テスト中なので、この値は大きすぎる必要はありません 
  • -num_iterations 100 訓練のステップ数(テストなので単純に100としました)
  • –flash 1 FlashAttentionをオンにするかどうかを指定(1はオン、0はオフ) 

実行結果

re

ご覧のように、GPUを使用した独自の金融言語モデルの訓練に成功しました。では、CPUを使って訓練した時間を取り出して比較してみましょう。 

古い  

元々、CPUの訓練処理には1ステップあたり平均約8000ミリ秒かかっていましたが、GPUの訓練処理には1ステップあたり80ミリ秒もかかりませんでした。

一部のパラメータは多少変更されているかもしれませんが、各訓練ステップの時間から、GPUを使用することで訓練プロセスが大幅に高速化され、ほぼ100倍以上に加速されることを見るのは難しくありません。  

私たちのモデルは、単純な例を訓練しただけで、最適化されていないので、テスト用のEAストラテジーを作成する必要はありません。ご想像のとおり、結果は非常に悪いものになるはずです。

しかしご心配なく。以下の記事では、独自のデータを使って大規模言語モデルを微調整し、EAを作成してテストする方法について説明します。  

この場所が次のエラーを報告した場合: RuntimeError:HIP error: the operation cannot be performed in the present state Compile with TORCH_USE_HIP_DSA to enable device-side assertions.  

環境変数を追加してみてください。  

export HSA_OVERRIDE_GFX_VERSION=11.0.0

export HIP_VISIBLE_DEVICES=0

export ROCM_PATH=/opt/rocm

export AMDGPU_TARGETS=gfx1100

または、train_gpt2.pyの先頭に以下のコードを追加してください。  

from os import putenv

putenv(“HSA_OVERRIDE_GFX_VERSION”, “11.0.0”)  

11.0.0は7900xtxのHSAですが、お使いのデバイスに合わせてHSAを確認し、適切な値に変更する必要があります。gfx1100は7900xtxのISAなので、お使いのハードウェアに合わせて適切な値に変更する必要があります。 


まとめ

この記事では、独自に設計したデータセットを使って、グラフィックスカード上で当社専用の大規模言語モデルを訓練する方法について説明しました。もちろん、AMDグラフィックスカードのアクセラレーテッドコンピューティングにおける開発環境構成についても触れ、本連載の第2回で触れられなかった部分を補足し、現在のアクセラレーテッドコンピューティング市場で主流となっている2つのグラフィックスカード(amdとnvidia)の環境構成も完成させました。  

しかし、このデモ例は最適化されていないため、同じようにモデルを評価したり、モデルに基づいてEAストラテジーを策定し、MetaTraderクライアントでテストしたりはしていません。なぜなら、現時点ではこのデモモデルは訓練前の段階に過ぎないため、これらの操作は不要であり、実用的なレベルに達していないからです。次の記事では、大規模言語モデルの微調整について説明し、対応するEA戦略を策定し、MetaTraderクライアントでテストします。  

では、次回の記事でお会いしましょう。 

MetaQuotes Ltdにより英語から翻訳されました。
元の記事: https://www.mql5.com/en/articles/13498

添付されたファイル |
data_enc.py (2.87 KB)
llm_data.csv (1139.04 KB)
Candlestick Trend Constraintモデルの構築(第5回):通知システム(パート1) Candlestick Trend Constraintモデルの構築(第5回):通知システム(パート1)
本連載で作成するTrend Constraint指標からのシグナル通知を受信するためのTelegramとWhatsAppの統合を説明するために、メインのMQL5コードを特定のコードスニペットに分解します。これにより、トレーダーや開発者(初心者か経験豊富かを問わず)が簡単にコンセプトを把握できるようになります。まず、MetaTrader 5の通知に関する設定と、ユーザーにとってのその意義について説明します。これは、開発者が自分のシステムにさらに応用するためのメモを事前に取るのに役立ちます。
ニューラルネットワークが簡単に(第79回):状態の文脈におけるFeature Aggregated Queries (FAQ) ニューラルネットワークが簡単に(第79回):状態の文脈におけるFeature Aggregated Queries (FAQ)
前回の記事では、画像内のオブジェクトを検出する方法の1つを紹介しました。ただし、静的な画像の処理は、私たちが分析する価格のダイナミクスのような動的な時系列の処理とは多少異なります。この記事では、私たちが解決しようとしている問題にやや近い、ビデオ中の物体を検出する方法について考えます。
Candlestick Trend Constraintモデルの構築(第5回):通知システム(パート2) Candlestick Trend Constraintモデルの構築(第5回):通知システム(パート2)
今日は、PythonとTelegram Bot APIと連携して、MQL5のパワーを活用した MetaTrader 5指標通知のための実用的なTelegram統合について説明します。ポイントが見逃がされることがないように、すべてを詳細に説明します。このプロジェクトが終了する頃には、ご自分のプロジェクトに応用できる貴重な洞察を得ることができるでしょう。
因果推論における傾向スコア 因果推論における傾向スコア
本稿では、因果推論におけるマッチングについて考察します。マッチングは、データセット内の類似した観測を比較するために使用されます。これは因果関係を正しく判定し、バイアスを取り除くために必要なことです。著者は、訓練されていない新しいデータではより安定する、機械学習に基づく取引システムを構築する際に、これがどのように役立つかを説明しています。傾向スコアは因果推論において中心的な役割を果たし、広く用いられています。