少し気まぐれに書いてしまったが、先生から 4 つのテーマが与えられた:
- YOLO 目標検出 - 6 クラス
- Unet 目標分割 - 3 クラス
- 大モデルの微調整
- LSTM に基づく詩の続き書き
最初の 2 つは何も学べなさそうで、4 つ目はトークナイズとデータセットのクリーニングが面倒すぎる。
というわけで、流れに乗って 3 つ目を選んだ。以前やったことがなく、何かを学びつつ楽しめたらいいなと思っている。それが求められているのは、対話できる医者だ。しかし、実はサイボーグの彼女を作りたいと思っている。=-=.
彼女は次回まで待たなければならない。
ローカルで Lora 微調整が動かせるのは嬉しい。データセットにはアイデアと参考が必要だ。
指示微調整#
通常、以下の形式をモデルのトレーニングセットとして使用する:
{
"instruction": "今から皇帝の側にいる女性--甄嬛を演じてください",
"input": "あなたは誰ですか?",
"output": "家父は大理寺少卿甄遠道です。"
}
非常に面白いモデルがあり、甄嬛の対話を使って大モデルを微調整しているようだ。それは Chat - 嬛嬛 と呼ばれているようだ。
しかし、私が今回やろうとしていることは、相対的にあまり面白くない。医者として、症状や医療に関する質問に答えるためのものだ。可能であれば、やはりサイボーグの彼女を調整したい。
しかし、今回はまずプロセスに慣れることにし、後で自由に調整できるようにする。
大モデルはトークナイザーなどをすべてラップしてくれているので、私たちはデータセットを入れるだけで済む。
埋め込みやマスク、アテンションなどは考慮する必要がなく、私のような怠け者でも遊べる。
私が作成した QA データセット:
リンク: https://pan.baidu.com/s/1VX-ffLlXjShXJOUlkAZIwA?pwd=tv2y 提取码: tv2y
Top3 プレビュー:
{
"instruction": "頭痛があり、十数年前から頭がふらふらする。風に当たったり、日光に当たると、騒がしいと頭が痛くなる。検査結果はどう治療すべきか。",
"input": "",
"output": ":神経性頭痛の可能性があり、機能的な病気で、緊張や精神的な要因によって神経機能の障害が引き起こされる頭痛で、遺伝的要因もある。一般的には中草薬の川芎茶調散を服用することを考慮し、鍼灸やマッサージを組み合わせると効果が良い。"
},
{
"instruction": "目が疲れて、開けられないほど乾燥している。",
"input": "",
"output": "一般的には結膜炎や乾燥症によって引き起こされるので、病院で検査を受けることをお勧めします。"
},
{
"instruction": "女性の左胸の下は何ですか?そこが痛いのはどういうことですか?",
"input": "",
"output": "心臓はその位置にあり、心臓の絞痛もそこにあるかもしれません。また、胃痛が原因である可能性もあり、胃痛の位置は心臓より少し下です。"
}
いくつかの質問には複数の回答が対応することがある。
データセットの出所は: zhangsheng93/cMedQA2
私はいくつかの簡単な処理を行い、データセットを json 形式に変換した。
また、長さが 100 または 150 を超える回答データはクリーニングした。なぜなら、私の GPU メモリが足りないからで、入力しても切り捨てる必要がある。
ここには 2 つの練習方法があり、一つは小さなデータセットで試したもので、top100 で 60 回練習してモデルに回答を覚えさせようとした。もう一つはデータセットを増やして、3、4 回だけ練習することだ。
まだ決めかねている。
これは私のトレーニングのロスの状況で、もし 2、3 回、3、4 回だけ練習した場合、実際にはモデルはデータを浅くしか見ておらず、元々の回答方法をあまり変えることはできないと思う。友人は LLM のロスはあまり意味がないと言うかもしれないが。
しかし、私はモデルが元々のように点を一つ一つ挙げて可能性を列挙する回答方法を改めてほしいと思っている。私が提供したデータセットのように、ただ一つの可能性を挙げて、提案を出してほしい。そういう話し方を学んでほしいと思っている。それが私の微調整の目的を達成することになる。
将来的にサイボーグの彼女を練習する場合、私は彼女がこういうふうに私と対話することを望んでいない:
今晩は何を食べる?これらはいいと思う:
- 火鍋、冬に火鍋を食べるのは最高の選択
- 寿司、寿司は日本料理の一種(何か奇妙なものが混ざっているようだ、これはcopilotが書いた)
- 北京ダック、北京の特産料理
- 焼き魚、焼き魚は湖南の特産料理
私は彼女がこう言ってくれることを望んでいる:
今晩は火鍋を食べよう、冬に火鍋が一番だ。
ワクワクする!
プロンプト自体はモデルの回答方法を変えることができるが、前のような回答方法を根本的に変えることはできないようだ。私は後者を得たいので、微調整を選び、多くの練習を選んだ。
Top 100 の 30 分 60 回の微調整の結果には非常に満足している。トレーニングセットではこのような結果だ:
ただし、犬肉を煮ることについてはあまり賛同できず、少し疑問に思っている。
犬肉とは関係がないようだ。しかし、多様性は得られた。六味地黄丸を食べることについても言われていたのを覚えている。=-=.
これは QA に対する:
"instruction": "毎朝起きる前に汗をかくことは治りますか?以前は薬を使っていませんでしたが、胃の病気があります。毎朝起きる前に汗をかくことに関する民間療法はありますか?",
"input": "",
"output": "容易に汗をかくのは気虚を考慮し、黄芪を茶にして飲むことや、鶏肉のスープを多く飲むことをお勧めします。また、補中益気丸、参苓白術散、補中益気湯丸を適度に服用することも考慮してください。"
もう一つ、トレーニングセット外のものを試してみる。
本当に言うべきことは、これは私の同意度が非常に高い。
copilot、夜のランニングと朝のランニングのどちらが良いと思いますか?
- 朝のランニング、朝のランニングは人体の新陳代謝を高め、減量に役立ちます。
- 夜のランニング、夜のランニングは心身をリラックスさせ、睡眠に役立ちます。
- 朝のランニング、朝のランニングは人体の新陳代謝を高め、減量に役立ちます。
- 夜のランニング、夜のランニングは心身をリラックスさせ、睡眠に役立ちます。
これは copilot が書いたものだ。
夜の 9 時以降に走ると、寝られなくなることを知らないのか。
さて、続けよう。
ただし、トレーニング方法を思いついた。まず小さなデータセットで多くの回数練習し、その後大きなデータセットで少ない回数練習する。前者は話し方を学び、モデルの表現力を高める。
しかし、これはチェックポイントの再トレーニングに関わるので、llama-factory が追加の操作を必要とするかどうかは分からない。
微調整のツール:#
このリポジトリは、多くの大モデルの微調整プロセスを jupyter notebook + markdown で書いており、ユーザーは基本的に一度実行すれば良い。
十分に怠け者になれるが、実際には潜在的な大きな問題がある。時間の経過とともに、python ライブラリのバージョンが更新され、transformers>4.35.0 のバージョンでは、いくつかの破壊的な変更が導入され、元の方法で多くのモデルが動かなくなった。
作者と同じ環境を試みても、win error のようなファイルが見つからない問題に直面することがある。
その時は docker が必要になる。
1 日の苦労の後、私は docker に切り替えた。
4060Ti16G グラフィック微調整トレーニング通義千問 Qwen モデル(初心者向け)
ここには、llama-factory を docker イメージにパッケージ化した人がいて、私はそのイメージをインストールするだけで、直接実行できる。
唯一の欠点は、彼が後で追加したパッケージのバージョンを指定していないこと:
pip install einops transformers_stream_generator optimum auto-gptq -i https://pypi.tuna.tsinghua.edu.cn/simple/ --trusted-host pypi.tuna.tsinghua.edu.cn
これだとデフォルトで最新のものがダウンロードされる。もし動画との間隔が長すぎると、新しい問題が発生するかもしれないので、その時は走らせる前にバージョンを指定する必要がある。
しかし、docker の利点は、システム環境の微小な差異による結果を心配する必要がないことだ。出発点は非常に高い。
確かに、このものは私を 1 時間も待たせたが、幸いにも私の GPU は直接呼び出せる。これで多くの面倒が解決され、テスト用の練習が終わったらバージョンを記録する。
最終的に決定したバージョンは:
>>> import einops
>>> einops.__version__
'0.8.0'
>>> import transformers
>>> transformers.__version__
'4.34.1'
(llama-factroy) root@docker-desktop:/LLaMA-Factory# pip show transformers_stream_generator
Name: transformers-stream-generator
Version: 0.0.5
>>> import datasets
>>> datasets.__version__
'2.14.6'
(llama-factroy) root@docker-desktop:/LLaMA-Factory# pip show optimum
Name: optimum
Version: 1.23.3
(llama-factroy) root@docker-desktop:/LLaMA-Factory# pip show auto-gptq
Name: auto-gptq
Version: 0.6.0
requirements.txt に書くと:
einops==0.8.0
transformers==4.34.1
transformers-stream-generator==0.0.5
datasets==2.14.6
optimum==1.23.3
auto-gptq==0.6.0
これらのパッケージの問題に加えて、--gpu all
の問題も解決する必要がある。Windows の場合は、Windows で Docker が NVIDIA Container Toolkit をサポートする方法を参考にできる。
これらのことを行うには、やはり Linux が最も便利だが、私のコンピュータは家にあり、Windows しか接続できない。
ステップ:#
1. データセットをダウンロードし、data
フォルダに置く。#
dataset_info.json
が必要だ。私のデータセットのリンクを参考にしてほしい。
注意点は、その中の sha1 のキーを削除しないこと。これは検証に使われるはずだが、以前のものを使っても問題ない。
しかし、これを削除すると、llama-factory でdataset_info.json cannot be found
というエラーが出続ける。人。
2. docker イメージをダウンロード:#
docker pull bucess/llama-factory:1
私が使っているのは公式のイメージではない。
ダウンロードには少し時間がかかるかもしれないし、時々レイヤーが止まることもあるが、心配しないで、安定したネットワーク環境を見つけて、アダプターを接続し、プロキシを使って待てば良い。
イメージがあれば、毎回の起動が非常に速くなる。コンテナが設定された後は、次回は直接start -i
で済む。
3. コンテナを起動:#
docker run -it --name llama-factory --gpus all --network host --shm-size 4g -v D:\senmen\data:/LLaMA-Factory/data bucess/llama-factory:1 /bin/bash
D:\senmen\data
の部分をデータセットの位置に変更する必要がある。もちろん、自信があればモデルも一緒に置いても良い。しかし、誤って削除してしまうと大変だ。
最良の試みはdocker cp
を使ってモデルをコピーすることだ。
4. Python パッケージを追加し、llama-factory を起動#
pip install einops==0.8.0 transformers==4.34.1 transformers-stream-generator==0.0.5 datasets==2.14.6 optimum==1.23.3 auto-gptq==0.6.0 -i https://pypi.tuna.tsinghua.edu.cn/simple/ --trusted-host pypi.tuna.tsinghua.edu.cn
-i https://pypi.tuna.tsinghua.edu.cn/simple/ --trusted-host pypi.tuna.tsinghua.edu.cn
このパラメータは非常に便利で、コンテナ内ではデフォルトでプロキシが設定されていないようなので、これを使えば特に一時的なhttp_proxy
を設定する必要がない。
src/train_web.py
を修正:(オプション)
gradio アプリを起動した後、ローカルで IP + ポートの形式でパネルにアクセスできなかったので、gradio の share パラメータを使用した。
(llama-factroy) root@docker-desktop:/LLaMA-Factory# cat src/train_web.py
from llmtuner import create_ui
def main():
demo = create_ui()
demo.queue()
demo.launch(share=True, inbrowser=True)
if __name__ == "__main__":
main()
注意すべき点は、これをダウンロードする必要がある:
https://cdn-media.huggingface.co/frpc-gradio-0.2/frpc_linux_amd64
これは常に Windows にウイルスとして報告され、自動的に削除される。
適切な場所に置き、名前を変更する必要があり、share=True を実行する際にこのファイルがないと自動的にエラーが発生するので、ここでは詳しくは述べない。参考にできる:
https://github.com/gradio-app/gradio/issues/8186
ここにエラーの詳細がある。
5. llama-factory を起動#
python src/train_web.py
もし 4 を実行した場合、これにより一時的な URL が生成され、任意のコンピュータから呼び出すことができる。
このような:https://d6cdc0f5cda64dd72b.gradio.live/
私のコンピュータは家にあり、学校でトレーニングし、呼び出しやデモを行う必要があるので、非常に便利だ。
6. top100 データセットを読み込み、トレーニング#
その後はすべて webui 操作になるので、ブログを書く者としては書かない。
dataset_info.json
の"name"
の後ろを"qa_top100.json"
に変更する必要がある。
具体的な操作は、4060Ti16G グラフィック微調整トレーニング通義千問 Qwen モデル(初心者向け)を参考にできる。
面白いことに、彼は int4 量子化モデルを使用してトレーニングし、最後に float32 に変換している。この方法はトレーニングのハードルを下げるだけでなく、非量子化モデルをエクスポートした後、推論速度が非常に速くなる。
これにより、私が以前に非量子化モデルを直接トレーニングしようとした最大の問題が解決された。Lora を使用しても、バッチサイズを 1 に設定しても、依然として GPU メモリが不足し、リモートデスクトップが黒くなり、ちらつくことがあった。
しかし、これらの操作を経て、私のバッチサイズを 8 に設定し、GPU メモリの使用量は約 13G で、使用率は常にフルだが、リモートデスクトップには影響しない。これは非常に良いことだ。
7. チェックポイントの再トレーニング(まだ実施していない)#
これは私が最後にやりたいことだ。なぜなら、小さなデータセットで多くの回数練習し、その後大きなデータセットで少ない回数練習することで、モデルが話し方を学び、大きなデータセットでより多くの知識を学べるようにしたいからだ。