618ZXW

「オープンソースの大規模モデル使用ガイド」: 大規模モデルをすぐにマスターしましょう! ベストプラクティスの新しい例!

オリジナル:Song Zhixue(Datawhale)

Datawhaleのヒント

著者: 宋志雪 Datawhaleメンバー

01

例シリーズの過去と現在

私たちは、オープンソースに体現された自由と平等の精神をもって、より広大で壮大な LLM の世界を実現し、LLM と一般大衆との架け橋となることを目指しています。

Self-llmオープンソースプロジェクトは、中国語初心者と中国語学習者向けに特別に設計されたチュートリアルで、オープンソースの大規模モデルに焦点を当てています。環境設定、ローカル展開、効率的な微調整など、様々なオープンソースの大規模モデルのプロセス全体を網羅したガイダンスを提供し、オープンソースの大規模モデルの展開、使用、そして応用プロセスを簡素化します。これにより、より多くの一般の学生や研究者がオープンソースの大規模モデルをより効果的に活用できるようになり、オープンソースや無料の大規模モデルが一般学習者の生活に素早く溶け込むようになります。

大規模モデル応用に関する学習者の理解をさらに深めるため、セルフLLMプロジェクトでは、大規模モデル応用に関するベストプラクティス集を追加しました。これらのアプリケーションは、最新の技術進歩と応用トレンドを反映するために継続的に更新されます。待望のセルフLLM事例シリーズの最初のバージョンがリリースされ、セルフLLMプロジェクトのさらなる拡大が示されました。

事例シリーズは、学習者が基礎知識を習得した後、厳選された実例を通して、大規模モデルアプリケーション開発のコアテクノロジーを深く理解し、習得できるよう支援することを目的としています。これらの事例は様々な実践的な応用を網羅し、学習者が大規模モデルを効果的に活用して現実世界の問題を解決する方法を探求し、実践できるよう導きます。綿密に設計された大規模モデルアプリケーションプロジェクトのデモを通して、学習者は事例を完了することで大規模モデルアプリケーション開発の主要な技術的側面を完全に理解するだけでなく、大規模モデルアプリケーションの二次開発や自己開発を自主的に行う能力を身に付けることを期待しています。プロジェクトはチュートリアルとブログの形式で提供されます。

プロジェクトアドレス ↓スターへようこそ⭐️

https://github.com/datawhalec...

02

例シリーズ - パート1

歓歓はどのように作られたのですか?

Chat-Zhenhuanは、『真歓伝』の脚本にある真歓に関するセリフや文章をすべて利用し、大規模モデルをベースにLoRAで微調整することで得られた、真歓の口調を模倣したチャット言語モデルです。

小説『後宮の妃たち』および同名テレビドラマの主人公である真歓は、もともと漢民族の真元道の娘でした。後に雍正帝から尼胡芙の姓を賜り、満州族の上三旗の一員となりました。彼女は亡き春元皇后に酷似していたことから宮廷に入り、数々の宮廷陰謀を経て、純朴な少女から策略家へと成長しました。年氏の野望が皇帝に見破られた後、真歓は皇帝を助けて政敵を排除し、皇帝の深い寵愛を得ました。皇后に陥れられたり、宮廷外で尼になったり、郭王に恋をしたりといった挫折を経験した後、真歓は宮廷への復帰を企て、双子を出産しました。最終的に、一連の陰謀を通じて皇后を倒し、雍正帝を毒殺し、乾隆帝の皇太后となり、絶大な権力を握った。

Chat-Zhenhuanは、「真歓伝」を起点に、小説や脚本に基づいたパーソナライズされたAI微調整モデルを作成するための完全なプロセスを実現しました。ユーザーは任意の小説や脚本を提供し、キャラクターを指定するだけで、このプロジェクトの全プロセスを実行できます。これにより、ユーザーは自分の好きな小説や脚本に基づいて、キャラクターの性格に合った、高い知能を持つパーソナライズされたAIを作成できます。

Chat-Huanhuanモデルは合計15.6k回ダウンロードされました。

モデルスコープアドレス:

https://www.modelscope.cn/mod...

Chat-Huanhuan は 500 個の星を獲得しました。

huahuan-chatプロジェクトアドレス:

https://github.com/KMnO4-zx/h...

xlab-huanhuan-chat プロジェクトアドレス:

https://github.com/KMnO4-zx/x...

それでは、Chat-Zhen Huanの実践的なトレーニングプロセスをステップバイステップで解説します。一緒に体験してみましょう!

ステップ1:環境の準備

この記事の基本的な環境は次のとおりです。

----------------
ウブントゥ 22.04
Python 3.12
CUDA 12.1

パイトーチ 2.3.0

この記事は、学習者が上記のPyTorch(CUDA)環境を既にインストールしていることを前提としています。まだインストールしていない場合は、ご自身でインストールしてください。

まず、 pipを使用してソースを切り替え、依存パッケージのダウンロードとインストールを高速化します。

アップグレード pip

python -m pip インストール --upgrade pip

ライブラリのインストールを高速化するために PyPI ソースを変更します。

pip config で global.index-url を設定します https://pypi.tuna.tsinghua.ed...

pip インストール modelscope==1.16.1
pip トランスフォーマーをインストール == 4.43.1
pip インストール accelerate==0.32.1
pipでpeft==0.11.1をインストール
pip インストール データセット == 2.20.0

ステップ2: データの準備

まず、「Empresses in the Palace」のスクリプトデータを準備する必要があります。ここでは「Empresses in the Palace」のスクリプトデータを使用します。元のデータの形式を確認できます。

第2幕(法廷が終了し、役人たちは解散する)
役人A:私たちの皇帝はニアン将軍とロンコド卿を本当に高く評価しています。
役人B:ロンコド卿、おめでとうございます!あなたは国の偉大な英雄です!
役人C:ニアン将軍、皇帝は本当にあなたを寵愛しています!
丁官:年公、あなたは皇帝の柱です!
スー・ペイシェン(ニアン・ゲンヤオに追いつく):ニアン将軍、お待ちください。一般的な-
年現瑶:蘇宦官、何かお役に立てることはございますか?
蘇培生:それはできません。陛下は将軍の腕の怪我を心配されており、この秘伝の傷薬をあなたにお渡しするようにと特別に指示されました。
年成瑶(金宮に向かって頭を下げながら):陛下、私、年成瑶は謹んで拝礼申し上げます!蘇宦官様、妹は今日、宮殿でどのようにお過ごしでしょうか?
蘇佩生:華妃は大変美しく、宮中で最も寵愛されている側室です。将軍、ご安心ください。
年瑶瑶:それなら蘇宦官に迷惑をかけなければならなくなる。(振り返って立ち去る)
スー・ペイシェン: もちろんです。

各行には文字と対応する行が含まれているため、このデータは次のように簡単にダイアログ形式に処理できます。

[
{"rloe":"公式A", "content":"我らの皇帝はニアン将軍とロンコド卿を本当に高く評価しておられます。"},
{"rloe":"公式B", "content":"ロンコド卿、おめでとうございます!あなたは国の偉大な英雄です!"},
{"rloe":"公式C", "content":"ニアン将軍、皇帝は本当にあなたを寵愛しています!"},
{"rloe":"官鼎", "content":"年公、あなたは皇帝の柱です!"},
{"rloe":"スー・ペイシェン", "content":"ニアン将軍、お待ちください。将軍—"},
...
]

次に、興味のあるキャラクターの会話を抽出し、Q&Aペアを作成します。このタイプのデータでは、正規表現などの方法を使用して、興味のあるキャラクターの会話を迅速に抽出できます。

しかし、多くの場合、そのような優れた台詞形式のデータはありません。そのため、大量のテキストからキャラクターの台詞データを抽出し、必要な形式に変換する必要があるかもしれません。

例えば、『西遊記』の現地語版では、テキストは次のようになっています。このようなテキストの場合、大規模モデルの機能を活用して登場人物とそれに対応するセリフを抽出する必要があります。そして、必要なオレンジ色のキャラクターのセリフをフィルタリングします。

extract-dialogueという小さなツールを使用して、テキストからダイアログを抽出できます。

……
孫悟空が去った後、混沌の魔王が水幕洞を占拠し、多くの猿の従者を誘拐したことが判明しました。これを聞いた孫悟空は激怒し、混沌の魔王の居場所を突き止め、復讐を決意しました。宙返り雲に乗って北へと飛び去りました。

やがて孫悟空は、いたずら魔王の水洞の入り口に到着し、入り口にいる小悪魔たちに叫びました。「お前たちの忌々しい魔王は、何度も我々猿をいじめてきた。今日は、その魔王と決闘するために来たのだ!」

小悪魔は洞窟に駆け込み、魔王に報告しました。魔王は急いで鉄の鎧を身につけ、大剣を手に取り、小悪魔たちに囲まれながら洞窟から出て行きました。

孫悟空は素手で魔王の剣を奪い取り、魔王を真っ二つに切り裂いた。そして、一握りの毛をむしり取り、噛み砕いて吐き出した。毛は無数の小猿に姿を変え、洞窟に突進して魔王たちを皆殺しにした。彼らはさらわれた猿を救出し、穢水洞に火を放った。
……

チャットZhen Huanの元データ:

https://github.com/KMnO4-zx/h...

西遊記の現地語版のオリジナルデータ:

https://github.com/KMnO4-zx/h...

最後に、次のようにデータをjson形式に整理します。

[
{
"指示": "お嬢様、他のお嬢様たちは皆選ばれることを望んでいますが、うちのお嬢様はただ拒絶されることを望んでいるだけです。菩薩様はきっとこのことを心に留めておられるでしょう…"
「入力」: "",
"output": "シーッ。声に出して願うと叶わないと言われています。"
},
{
"instruction": "この文帝医は実に奇妙な人物だ。帝医は皇帝の命がなければ皇族以外の人を診察したり診断したりできないのは周知の事実だが、彼は十日おき、あるいは半月おきに必ず我々の邸宅に駆けつけているのだ。"
「入力」: "",
"output": "あなたたち二人は話しすぎです。適切な治療をするために、ウェン医師に薬を頼んだほうがいいかもしれません。"
},
{
"instruction": "フアン姉さん、私はあなたの脈を診るために屋敷へ行きました、そしてジェン叔母さんからあなたがここに線香を捧げに来たと聞きました。"
「入力」: "",
出力: 「散歩に出かけるのはリラックスするのに良い方法です。」
}
]

チャット・フアンファンのデータ:

https://github.com/datawhalec...

したがって、このステップでデータを処理するための一般的なアプローチは次のとおりです。

1. 生データから文字と会話を抽出します。

2. 興味のあるキャラクターのセリフを除外します。

3. ダイアログを必要な形式に変換します。

このステップでは、例えば2~3個のデータポイントを例としてLLM(Local Level Management)システムに入力し、類似したスタイルデータを生成するといったデータ拡張も行えます。あるいは、日常会話のデータセットを見つけてRAG(Rapid Amplification)を使用し、固定された文字スタイルの会話データを生成することもできます。ぜひ自由に実験してみてください!

ステップ3: モデルのトレーニング

次のステップはおそらく皆さんもよくご存知でしょう。すべてのself-llmモデルには、 Loraファインチューニングモジュールが搭載されています。必要な形式にデータを処理して、トレーニングスクリプトを呼び出すだけです。

ここでは、微調整のためにLLaMA3_1-8B-Instructモデルを選択します。まず、モデルをダウンロードする必要がありますmodel_download.pyという名前のファイルを作成し、以下の内容を入力してください。

輸入トーチ
modelscope から snapshot\_download、AutoModel、AutoTokenizer をインポートします。
インポートOS

model\_dir = snapshot\_download('LLM-Research/Meta-Llama-3.1-8B-Instruct', cache\_dir='/root/autodl-tmp', revision='master')

注意: cache_dirモデルのダウンロード パスに変更することを忘れないでください。

次に、学習コードを準備します。Self self-llmに慣れている方なら、このステップは非常に簡単でしょう。ここでは、 train.pyカレントディレクトリに配置します。データセットパスとモデルパスは、この中で変更できます。

あるいは、self-llm の LORA チューニング チュートリアルを使用することもできます。

チュートリアルアドレス:

https://github.com/datawhalec...

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

Python の train.py

注意: train.pyのデータセット パスとモデル パスを必ず変更してください。

トレーニングには約20~30分かかります。トレーニングが完了すると、 outputディレクトリにloraモデルが生成されます。以下のコードでテストできます。

トランスフォーマーから AutoModelForCausalLM、AutoTokenizer をインポート
輸入トーチ
PeftからPeftModelをインポート

mode\_path = './LLM-Research/Meta-Llama-3\_\_\_1-8B-Instruct'
lora_path = './output/llama3_1_instruct_lora/checkpoint-699' # これをlora出力に対応するチェックポイントアドレスに置き換えます

トークナイザーをロードする

トークナイザー = AutoTokenizer.from\_pretrained(mode\_path, trust\_remote\_code=True)

モデルの読み込み

モデル = AutoModelForCausalLM.from\_pretrained(mode\_path, device\_map="auto",torch\_dtype=torch.bfloat16, trust\_remote\_code=True).eval()

LoRaウェイトの読み込み

モデル = PeftModel.from\_pretrained(モデル、モデル\_id=lora\_path)

prompt = "Huanhuan、どうしたの?私はあなたを応援しているよ!"

メッセージ = [
{"role": "system", "content": "あなたが皇帝の側にいる女性、ジェン・フアンであると想像してください。"},
{"ロール": "ユーザー", "コンテンツ": プロンプト}
]

input\_ids = tokenizer.apply\_chat\_template(メッセージ、tokenize=False、add\_generation\_prompt=True)

印刷(input_ids)

model\_inputs = tokenizer([input\_ids], return\_tensors="pt").to('cuda')
生成された\_ids = model.generate(model\_inputs.input\_ids,max\_new\_tokens=512)

生成されたID = [
input\_ids、output\_ids の zip(model\_inputs.input\_ids、generated\_ids) 内の output\_ids[len(input\_ids):]
]
レスポンス = tokenizer.batch\_decode(generated\_ids, skip\_special\_tokens=True)[0]
print('陛下:', prompt)
print('嬛嬛:',response)

陛下:歓歓、どうしたのですか?私はあなたのためにここにいます!
歓歓:陛下、そんなつもりはなかったんです。

次は、このHuanhuanモデルを使って会話をしてみましょう!興味のある学生はself-llmの他のモデルを使って微調整し、学習結果をテストしてみてください!

結論は

Chat-Huanhuanは昨年、LLMプログラムがちょうど人気になり始めた頃に誕生しました。何か行動を起こさなければ、多くの興味深い出来事を見逃してしまうかもしれないと感じました。そこで、数人の友人と私はこのプロジェクトに多くの時間を費やしました。多くのことを学び、多くの問題に直面しましたが、すべて解決することができました。Chat-Huanhuanは賞も受賞し、大きな注目を集めました。ですから、このプロジェクトは非常に意義深く、非常に興味深いものだと思います。

  • 2023年 iFlytek Spark Cup 人間認知大規模モデルシナリオイノベーションコンペティション トップ50
  • 2024年 曙盛・普宇大模型コンテスト(春季) クリエイティブ応募作品賞 上位12名

チャット - Huanhuan 寄稿者

  • Song Zhixue (Datawhale メンバー)
  • ゾウ・ユーヘン(Datawhale メンバー)
  • 王一明(Datawhale メンバー)
  • 鄧宇文(Datawhaleメンバー)
  • Du Sen (Datawhaleメンバー)
  • シャオ・ホンルー(Datawhale メンバー)

-終わり-

大規模なモデル アプリケーションの開発に熱意のある貢献者を歓迎します。

一緒にセルフ LLM の例シリーズを構築して共有しましょう。