バックグラウンド
前回の記事「GPT 大規模言語モデル Alpaca-lora ローカリゼーション展開の実践」では、スタンフォード大学の Alpaca-lora モデルのローカリゼーション展開を紹介し、実際の推論効果を検証しました。
全体的な感触は実際には特に理想的ではありません。元の Alpaca-lora モデルは中国語を十分にサポートしていません。52k の中国語命令セットでモデルを微調整した後でも、その効果は GPT-3.5 の推論効果ほど良くありません。とネットで言われていますが、その文を検証してみました:「物は見えない、聞こえないけど、あるかないかは推測するけど大丈夫?」
3 枚の Tesla P40 グラフィックス カードを備えたサーバーでは、3 枚の GPU グラフィックス カードを使用してモデル パラメーターと計算をロードすると、単純な推論 (非数学的および論理演算) を実行するのに約 30 秒から 1 分かかり、効率は驚くほど遅くなります。JD Cloud GPU クラウド ホストの導入では、推論効率が大幅に向上し、モデルが中国語のデータセットで微調整されていますが、中国語のサポートがあまり良くなく、文字化けや繰り返しの問題が発生することがよくあります。そして意味不明な言葉など。
最近、大規模モデルが春の雨後の筍のように出現し、さまざまな大手工場や科学研究機関が独自の大規模モデルを立ち上げていますが、そのほとんどが LLaMA (オープンソースで使いやすい) をベースにしているため、推論の効果が良いかどうかを確認するために他のモデルも見てみることにしましたが、中国語のサポートが充実しており、推論効率が高いモデルです。
スクリーニングの結果、Vicuna-13B の推論効果は ChatGPT の能力の 90% 以上に達したと言われており、LLaMA-13B や Alpaca-13B の効果より優れています (下図参照)。評価方法は、Alpaca、LLaMA、ChatGPT、Bardの各モデルに同じ質問を入力し、GPT-4を審判員として推論結果を採点し、ChatGPTの回答を100点とし、回答に近いほど評価します。つまり、スコアが高くなります (評価方法は非科学的ではありませんが、現時点ではモデル推論の結果をより科学的に評価するためのこれより良い方法はありません)。
同時に、Vicuna の訓練コストも非常に安く、300 ドル程度で済むと言われていますので、Vicuna-7B を現地に配備して効果を確認し、有言実行してみてください。
環境整備
Alpaca-lora モデルは以前にローカルにデプロイしたことがあったので、オープン ソース パッケージを直接ダウンロードして、簡単なデプロイ後の効果を確認できると考えていましたが、私はまだ「若すぎて、単純すぎる」ことがわかりました。パッケージ競合の解決 このプロセスは、Alpaca-lora モデルを初めてデプロイするよりも手間がかかることが判明しました。
導入プロセスを簡単に要約します。詳細については、以前の記事「GPT 大規模言語モデル Alpaca-lora ローカリゼーション導入の実践」を参照してください。
- ローカル展開または GPU クラウド ホスト展開: GPU サーバーには 4 つの独立した GPU があり、モデルは P40 であり、単一の P40 の計算能力は、同じメイン周波数を持つ 60 個の CPU の計算能力に相当します。GPU クラウド ホストは、 P40を購入https://www.jdcloud.com/cn/calculator/calHost
- グラフィックカードドライバーとCUDAドライバーをインストールする
モデルの準備
Vicuna は LLaMA モデルに基づいているため、LLaMA モデルのライセンス認証に準拠するにはデルタ ウェイトのみがリリースされるため、ビキューナ ウェイトを取得するには、元の llama-7b モデルとデルタ モデルのウェイトを組み合わせる必要があります。
1 つ目は、llama-7b モデルをダウンロードすることです。ファイルは比較的大きいため、lfs を使用してファイル サーバーから直接ダウンロードします。サイズは 26G です。次を実行します。
git lfsclonehttps://huggingface.co/decapoda-research/llama-7b-hf
次に、デルタ モデルをダウンロードして実行します。
git lfsclonehttps://huggingface.co/lmsys/vicuna-7b-delta-v1.1
ダウンロードが完了したら、重みをマージして実行します。
python -m fastchat.model.apply_delta \ --base ./model/llama-7b-hf \ --delta ./model/vicuna-7b-delta-v1.1 \ --target ./model/vicuna-7b-すべて-v1.1
このマージ処理は非常に高速で、最終的な結果は次のようになります. マージ後のパラメータのサイズは 13G になります。
マージされたディレクトリには設定ファイルとデータ ファイルが存在します。
依存関係をインストールする
Vicuna は主に fschat、tensorboardX、flash-attn の 3 つの依存パッケージを使用します。最初の 2 つのインストールは比較的スムーズで、直接 pip install fschat と tensorboardX でインストールを完了できます。flash-attn のインストールで問題が発生し、次のエラーが報告されました。
いくつかの検索の結果、gcc のバージョンが低すぎることがわかり、gcc をアップグレードする必要がありました。まず、ローカルの gcc バージョンを確認したところ、gcc -v および g++ -v で 4.8.5 であることがわかりました。アップグレードするには、最新バージョンにアップグレードするだけで、バージョン 13.1 を直接ダウンロードし、
http://ftp.gnu.org/gnu/gcc/ でインストールするバージョンを選択できます (ここでは gcc-13.1.0)。 .tar.gz。
埋め込む:
tar -xzf gcc-13.1.0.tar.gz
cd gcc-13.1.0
./contrib/download_prerequisites
mkdir ビルド
cd ビルド/
../configure -enable-checking=release -enable-langages=c,c++ -disable-multilib
次に、make を実行してコンパイルします。ここでの make 時間は非常に長く、数時間続く場合があることに注意してください。make -j 8 を使用すると、make に最大 8 つのコンパイル コマンドを同時に実行させ、コンパイルを高速化できます。
正常に完了したら、make install を実行してインストールします。
その後、gcc -v および g++ -v を使用してバージョンが更新されているかどうかを確認し、次のようなプロンプトが表示されればインストールは完了です。
次に、元の gcc と g++ をアンインストールし、root 権限に切り替えて、yum -y replace gcc g++ を実行する必要があります。
新しいバージョンをグローバルに利用できるように構成するには、 ln -s /usr/local/bin/gcc /usr/bin/gcc を実行します。
リンク ライブラリを更新するには、次を実行します。
元のリンク ライブラリを表示します: strings /usr/lib64/libstdc++.so.6 | grep CXXABI
元のリンク ライブラリを削除します: rm -f /usr/lib64/libstdc++.so.6
ソフト リンクを確立します: ln -s /usr/local/lib64/libstdc++.so.6.0.29 /usr/lib64/libstdc++.so.6
新しいリンク ライブラリを確認します: strings /usr/lib64/libstdc++.so.6 | grep CXXABI
最新バージョンに変更があった場合は、アップグレードが成功したことを意味します。
cudaをインストールする
以前 cuda を rpm パッケージでインストールしたため、いくつかのファイルが欠落していたり、実行時にさまざまな奇妙なエラーが報告されたりするため、ここでは詳細は説明せず(経験した人だけが理解できる)、プロセスを直接紹介しますバイナリファイルを使用して cuda をインストールする方法。
ここでは runfile(local) を選択する必要があることに注意してください。
次に、sh
cuda_11.7.0_515.43.04_linux.run を実行します。
インストールが完了したら、環境変数を構成し、ローカルの .bash_profile で次の 2 つの項目を構成する必要があります。
次に、インストールが成功したかどうかを確認し、次の図に示すように nvcc -V を実行します。インストールは成功しました。
cudnn と nccl をインストールする
cudnn と nccl をインストールするには、まず nvidia にアカウントを登録する必要があります。登録後、次の 2 つのアドレスから対応する rpm パッケージをダウンロードし、次に rpm -ivh XXXXX.rpm パッケージをダウンロードします。
cudnn ダウンロードアドレス: https://developer.nvidia.com/cudnn
nccl ダウンロードアドレス: https://developer.nvidia.com/nccl/nccl-legacy-downloads
インストールが完了すると、次の図に示すように、rpm パッケージが正常にインストールされます。
モデル推論
もう一度エキサイティングな時間です。モデルがどの程度うまく機能するかをテストして確認してみませんか? まずは、乾いていない汗を拭きましょう、最終的にはロボットプログラムと会話できるようになるのが目標です、理想はロボットではないと思わせる状態です。
ターミナルで次のコマンドを実行し、質問を入力します。
python -m fastchat.serve.cli --モデルパス ./model/vicuna-7b-all-v1.1 --style rich
もちろん、次のように、さまざまな需要シナリオに応じて未使用の動作パラメータを設定することもできます。
#圧縮モデルの予測効果は若干悪くなりますが、GPUメモリが十分ではないシナリオに適しています
python -m fastchat.serve.cli --model-path ./model/vicuna-7b-all-v1.1 --load-8bit --style rich
#推論に CPU を使用すると、速度が非常に遅くなりますので、注意して使用してください
python -m fastchat.serve.cli --モデルパス ./model/vicuna-7b-all-v1.1 --device cpu --style rich
# 予測に複数の GPU を使用する
python -m fastchat.serve.cli --model-path ./model/vicuna-7b-all-v1.1 --num-gpus 3 --style rich
1) 推奨レシピテスト:
2) 多言語テスト:
3) コード能力テスト:
4) 数学的計算テスト
5) 一般的な対話の推奨事項
推論プロセスでの GPU サーバー リソースの使用量。現時点では、推論に単一の GPU を使用すると、第 2 レベルの応答を達成できます。GPU メモリは空で、13G がロードされていますが、推論中は 15G 未満です。単一の GPU のコンピューティング能力以下の図に示すように、GPU は基本的に推論中に 90% 以上、さらには 100% に達することもあります。
結論は:
1) 緻密な推論の効果は、レシピを推奨するなどあまり理想的ではなく、非常にナンセンスな印象があり、推論の結果に従っておいしい料理を作るのは難しい。
2) 複数の自然言語のサポート、これは本当に予想外で、日本語とスペイン語さえも自由に扱うことができ、これは非常に驚くべきことと言えます。
3) コーディング能力はまだ高く、基本的な要件は大まかに示すことができます。
4)現時点ではデータ計算能力がまだ比較的弱く、単純な掛け算では正しい答えを得ることができない。
5)普通の会話は全く問題なく、中国語の理解が十分期待に応えられるか、退屈や孤独感をカバーできるか。
モデルはまだ微調整を行っていないため、現在の推論効果から判断すると、すでに非常に優れており、推論の効率も非常に優れており、推論に単一の GPU を使用した場合でも、第 2 レベルを達成できます。メディアメモリのメモリ使用率は 60% 強にすぎず、無負荷時の 50% と大差ない つまり、微調整を行わないと、推論パフォーマンスと推論効率が低下します。十分なコーパスと長期にわたる微調整があれば、モデルは依然として 7 ~ 8 ポイント (10 ポイント中) のスコアを獲得できますが、それでも効果は期待できます。
モデルの微調整
特定の分野のシーンに適したモデルにするためには、その分野の知識を得ることが必須であり、元のモデルをベースに微調整を行う必要があるので、微調整を行って確認してみましょう使い方。
微調整するには、ターミナルでコマンドを実行する必要があります。
torchrun --nproc_per_node=3 --master_port=40001 ./FastChat/fastchat/train/train_mem.py \
--model_name_or_path ./model/llama-7b-hf \
--data_path dummy.json \
--bf16 False \
--output_dir ./model/vicuna-dummy \
--num_train_epochs 2 \
--per_device_train_batch_size 1 \
--per_device_eval_batch_size 1 \
--gradient_accumulation_steps 8 \
--evaluation_strategy "no" \
--save_strategy "steps" \
--save_steps 300 \
--save_total_limit 10 \
--learning_rate 2e-5 \
--weight_decay 0. \
--warmup_ratio 0.03 \
--lr_scheduler_type "cosine" \
--logging_steps 1 \
--report_to "tensorboard" \
--fsdp "full_shard auto_wrap" \
--fsdp_transformer_layer_cls_to_wrap 'LlamaDecoderLayer' \
--tf32 False \
--model_max_length 2048 \
--gradient_checkpointing True \
--lazy_preprocess True
最後に、./model/vicuna-dummy ディレクトリの出力は、微調整後のモデル重みファイル ディレクトリです。
残念ながら、この記事の微調整は成功せず、次のようなエラーが発生しました。
理由も非常に単純です。使用している GPU モデルが Tesla P40 であるため、このグラフィックス カードは SM_62 アーキテクチャを使用しています。現時点では、モデルの微調整には少なくとも SM_75 以上のアーキテクチャが必要です。微調整についてはコミュニティを参照してください。 4090、A100、または A80 グラフィックス カードでは成功します。はい、したがって、微調整は、より上位のアーキテクチャを備えたグラフィックス カードでのみ実行できます。
ファローアップ
結局のところ、Vicuna モデルは全体的なパフォーマンスと推論効率の点で Alpaca モデルを圧倒していると言えます。この記事ではテストに Vicuna-7b を使用しました。Vicuna-13b であれば効果はさらに優れています。複数の自然言語(中国語を含む)に使用できる サポートも Alpaca モデルよりはるかに優れている 確かに、コミュニティが言っているように、現在の Vicuna モデルはオープンソースの大型モデルの上限であると言えます。オープンソースの大規模モデルに基づいて二次開発を実行したい場合は、これが最適な選択です。
大規模モデルに基づくローカリゼーション展開作業は終了しており、フォローアップ作業には次の点が含まれる可能性があります。
1) より優れたグラフィックス カードを使用している場合は、ビキューナで微調整を実行して、微調整後にモデルが特定の分野の知識を学習できるかどうかを確認できます。フォローアップは、会社が提供する試用版リソースを使用する予定です [JD]クラウド GPU クラウド ホスト p.n3a100シリーズ]、この製品は、Intel® Xeon® Platinum 8338C プロセッサと DDR4 メモリを搭載した Nvidia® A100 GPU (80G ビデオ メモリ) を提供し、NVLink をサポートし、単精度浮動小数点計算のピークは 156TFlops に達します。最強のコンピューティングパワーアップと言えます。
2) 現在のアプリケーションと組み合わせる適切なシナリオを見つけて、大規模言語モデルのアプリケーションを実装します。
3) vicuna オープンソース プロジェクトに基づいて二次開発を実行し、利用可能なサービスにパッケージ化します。
4) 大規模な言語モデルに基づいたさらなる探索と学習。
出典: JD Cloud 開発者コミュニティ
著者:Beyond_luo(無断転載禁止)