XnneHang

XnneHang

github
steam_profiles
douban

記録指令微調整 Qwen-7B-Chat

少し気まぐれに書いてしまったが、先生から 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 回だけ練習した。

まだ決めかねている。

alt text

これは私のトレーニングの損失の状況で、もし 2、3 回、3、4 回だけ練習した場合、実際にはモデルはデータを浅くしか見ておらず、元々の回答方法はあまり変わらないと思う。友人の中には LLM の損失はあまり意味がないと言うかもしれないが。

しかし、私はモデルが元々のように回答を一つ一つ列挙する方法を改め、私が提供したデータセットのように一つの可能性を提案し、解決策を提示するように学んでほしい。それが私の微調整の目的を達成することになる。

将来的にサイボーグの彼女を練習する場合、私は彼女がこうやって私と対話することを望んでいない:

今晩は何を食べたいですか?これらはいいと思います:

- 火鍋、冬に火鍋を食べるのは最高の選択です
- 寿司、寿司は日本料理です(何か奇妙なものが混ざっているようですが、これはcopilotが書いたものです)
- 北京ダック、北京の名物料理です
- 焼き魚、焼き魚は湖南の名物料理です

私は彼女がこう言ってくれることを望んでいる:

今晩は火鍋を食べましょう、冬に火鍋が一番です。

興奮する!

プロンプト自体はモデルの回答方法を変えることができるが、前の回答方法を根本的に変えることはできないようで、私は後者を得たいと思っている。だから微調整を選び、より多くの練習を選んだ。

Top 100 で 30 分 60 回の微調整を経て、効果にはかなり満足している。トレーニングセットではこうなっている:

alt text
alt text

ただし、犬肉を煮ることにはあまり賛同できず、少し疑問に思っている。

alt text

どうやら犬肉とは関係がないようだ。しかし、多様性は得られた。六味地黄丸を食べることについても言われていたことを覚えている。=-=

これは QA に対する:

"instruction": "毎朝起きる前に汗をかくことは治りますか?以前は薬を使っていませんでしたが、胃の病気があります。毎朝起きる前に汗をかくことについての偏方はありますか?",
"input": "",
"output": "汗をかきやすいのは気虚の可能性があり、黄芪をお茶にして多く飲むことや、鶏肉のスープを多く飲むことをお勧めします。また、中益気丸、参苓白術散、補中益気湯丸などを適度に服用することもできます。"

もう一つ、トレーニングセット外のものを試してみる。

alt text

本当に言うべきことは、これには非常に高い同意度がある。

copilot、夜のランニングと朝のランニング、どちらが良いと思いますか?

- 朝のランニング、朝のランニングは新陳代謝を高め、減量に役立ちます。
- 夜のランニング、夜のランニングは心身をリラックスさせ、睡眠に役立ちます。
- 朝のランニング、朝のランニングは新陳代謝を高め、減量に役立ちます。
- 夜のランニング、夜のランニングは心身をリラックスさせ、睡眠に役立ちます。

これは copilot が書いたものだ。

あなたは 9 時以降にランニングをすると、より眠れなくなることを知らないのか。

話をやめて、次に進もう。

しかし、私は一つのトレーニング方法を考えた。それは、まず小さなデータセットで多くの回数を練習し、その後大きなデータセットで少ない回数を練習することだ。前者は話し方を学び、モデルの表現能力を高める。

しかし、これはチェックポイントの再トレーニングに関わるもので、llama-factory が特別な操作を必要とするかどうかはわからない。

微調整のツール:#

datawhalechina/self-llm

このリポジトリは多くの大モデルの微調整プロセスを jupyter notebook + markdown で書いており、ユーザーは基本的に一度実行すれば良い。

すでに十分に怠けていると言えるが、実際には潜在的に大きな問題がある。時間の経過とともに、python ライブラリのバージョンが更新され、transformers>4.35.0 のバージョンでは、いくつかの破壊的な変更が導入され、元の方法で多くのモデルが動かなくなった。

作者と同じ環境を試みても、win エラーでファイルが見つからない問題に直面することがある。

その時は docker が必要になる。

1 日の苦労の後、私は思い切って docker に移行した。

4060Ti16G GPU でのグラフィカルな微調整トレーニング通義千問 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 が見つかりません」とエラーが出続ける。

2. docker イメージをダウンロード:#

docker pull bucess/llama-factory:1

私が使っているのは公式のイメージではない。

ダウンロードには少し時間がかかるかもしれないし、時々レイヤーが止まることもあるが、心配しないで、安定したネットワーク環境を見つけて、アダプターを接続し、VPN を使って待つだけだ。

イメージがあれば、毎回の起動は非常に速い。コンテナが設定された後は、次回は直接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. トップ 100 データセットを読み込み、トレーニング#

その後はすべて webui 操作になるので、ブログを書く者としては詳しくは書かない。

dataset_info.json の"name"の後ろを"qa_top100.json"に変更する必要がある。

具体的な操作は、4060Ti16G GPU でのグラフィカルな微調整トレーニング通義千問 Qwen モデル(初心者向け)を参考にできる。

面白いことに、彼は int4 量子化モデルを使ってトレーニングを行い、最後に float32 に変換するという方法を用いている。これにより、トレーニングのハードルが下がり、非量子化モデルをエクスポートした後、推論速度が非常に速くなる。

これにより、私が以前に非量子化モデルを直接トレーニングしようとした最大の問題が解決された。Lora を使用しても、バッチサイズを 1 に設定しても、GPU メモリが爆発し、不安定でリモートデスクトップが黒くなり、ちらつくことがあった。

しかし、この一連の操作を経て、私のバッチサイズを 8 に設定し、メモリ使用量は約 13G で、使用率は常にフルだが、リモートデスクトップには影響を与えない。これは素晴らしい。

7. チェックポイントの再トレーニング(まだ実施していない)#

これは私が最後にやりたいことだ。なぜなら、小さなデータセットで多くの回数を練習し、その後大きなデータセットで少ない回数を練習することで、モデルが話し方を学び、大きなデータセットでより多くの知識を学べるようにしたいからだ。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。