MakiAi commited on
Commit
b1a8153
·
1 Parent(s): 392c1ec

🚀 feat: Unslothを用いたLlama-3.2モデルの高速推論実装ガイドを作成

Browse files

- Unslothライブラリのインストールから、モデルのロード、推論の実行、実行例までを詳細に解説したガイドを作成しました。
- 4bit量子化によるメモリ効率の改善と高速推論モードの有効化について説明しました。
- LLaMA 3.1のチャットテンプレートを使用することで、異なるモデルでも安定した推論を実現する方法を示しました。
- 複数の実行例を含め、より実践的な内容としました。

Files changed (1) hide show
  1. sandbox/Unsloth_inference_llama3-2.md +158 -0
sandbox/Unsloth_inference_llama3-2.md ADDED
@@ -0,0 +1,158 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # 🦙 Unslothで作成したLLaMA 3.2ベースのファインチューニングモデルを使った高速推論ガイド
2
+
3
+ ## 📦 必要なライブラリのインストール
4
+
5
+ ```python
6
+ %%capture
7
+ !pip install unsloth
8
+ # 最新のUnslothナイトリービルドを取得
9
+ !pip uninstall unsloth -y && pip install --upgrade --no-cache-dir "unsloth[colab-new] @ git+https://github.com/unslothai/unsloth.git"
10
+ ```
11
+
12
+ **解説**:
13
+ Unslothライブラリをインストールします。このライブラリを使用することで、LLaMAモデルのファインチューニングと推論を大幅に高速化できます。ナイトリービルドを使用することで、最新の機能と改善が利用可能です。
14
+
15
+ ## 🔧 ライブラリのインポートと基本設定
16
+
17
+ ```python
18
+ from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
19
+ from unsloth import FastLanguageModel
20
+ from unsloth.chat_templates import get_chat_template
21
+ import torch
22
+
23
+ # モデルの基本設定
24
+ max_seq_length = 512
25
+ dtype = None
26
+ load_in_4bit = True
27
+ model_id = "MakiAi/Llama-3-2-3B-Instruct-bnb-4bit-10epochs-adapter" # ファインチューニング済みのモデルパス
28
+ ```
29
+
30
+ **解説**:
31
+ - 必要なライブラリをインポート
32
+ - モデルは4ビット量子化を使用して、メモリ効率を改善
33
+ - `model_id`には、Unslothでファインチューニングしたモデルのパスを指定
34
+
35
+ ## 🚀 モデルとトークナイザーの初期化
36
+
37
+ ```python
38
+ # モデルとトークナイザーのロード
39
+ model, tokenizer = FastLanguageModel.from_pretrained(
40
+ model_name=model_id,
41
+ dtype=dtype,
42
+ load_in_4bit=load_in_4bit,
43
+ trust_remote_code=True,
44
+ )
45
+
46
+ # LLaMA 3.1のチャットテンプレートを使用
47
+ tokenizer = get_chat_template(
48
+ tokenizer,
49
+ chat_template="llama-3.1", # LLaMA 3.1のテンプレートで問題なし
50
+ )
51
+
52
+ # 高速推論モードを有効化
53
+ FastLanguageModel.for_inference(model) # 通常の2倍の速度
54
+ ```
55
+
56
+ **解説**:
57
+ 1. ファインチューニング済みのモデルをロード
58
+ 2. LLaMA 3.1のチャットテンプレートを適用(3.2でも互換性あり)
59
+ 3. Unslothの高速推論モードを有効化
60
+
61
+ ## 💬 データセットを使用した推論の実装
62
+
63
+ ```python
64
+ def generate_response(dataset_entry):
65
+ """
66
+ データセットのエントリーに対して応答を生成する関数
67
+ """
68
+ # メッセージの作成
69
+ messages = [
70
+ {"role": "user", "content": dataset_entry["conversations"][0]['content']},
71
+ ]
72
+
73
+ # チャットテンプレートの適用
74
+ inputs = tokenizer.apply_chat_template(
75
+ messages,
76
+ tokenize=True,
77
+ add_generation_prompt=True, # 生成プロンプトの追加
78
+ return_tensors="pt",
79
+ ).to(model.device)
80
+
81
+ # 応答の生成
82
+ outputs = model.generate(
83
+ input_ids=inputs,
84
+ max_new_tokens=64, # 生成するトークン数
85
+ use_cache=True, # キャッシュを使用して高速化
86
+ temperature=1.5, # より創造的な応答を生成
87
+ min_p=0.1 # 出力の多様性を確保
88
+ )
89
+
90
+ return tokenizer.batch_decode(outputs)
91
+ ```
92
+
93
+ **解説**:
94
+ この関数は:
95
+ 1. データセットのエントリーからユーザーの入力を抽出
96
+ 2. LLaMA 3.1形式のチャットテンプレートを適用
97
+ 3. 以下のパラメータで応答を生成:
98
+ - `max_new_tokens`: 64(短めの応答を生成)
99
+ - `temperature`: 1.5(創造性を高める)
100
+ - `min_p`: 0.1(多様な応答を確保)
101
+
102
+ ## ✅ 実行例
103
+
104
+ ```python
105
+ if __name__ == "__main__":
106
+ # テストデータセット
107
+ dataset = [
108
+ {"conversations": [{"content": "火焔猫燐について教えてください。"}]},
109
+ {"conversations": [{"content": "水橋パルスィの本質は何ですか?"}]},
110
+ {"conversations": [{"content": "プログラミング初心者へのアドバイスをお願いします。"}]}
111
+ ]
112
+
113
+ # 2番目のデータセットエントリーで試してみる
114
+ response = generate_response(dataset[0])
115
+
116
+ print("入力:", dataset[0]["conversations"][0]['content'])
117
+ print("応答:", response)
118
+ ```
119
+
120
+ ```python
121
+ if __name__ == "__main__":
122
+ # テストデータセット
123
+ dataset = [
124
+ {"conversations": [{"content": "火焔猫燐について教えてください。"}]},
125
+ {"conversations": [{"content": "水橋パルスィの本質は何ですか?"}]},
126
+ {"conversations": [{"content": "プログラミング初心者へのアドバイスをお願いします。"}]}
127
+ ]
128
+
129
+ # 2番目のデータセットエントリーで試してみる
130
+ response = generate_response(dataset[1])
131
+
132
+ print("入力:", dataset[1]["conversations"][0]['content'])
133
+ print("応答:", response)
134
+ ```
135
+
136
+ ```python
137
+ if __name__ == "__main__":
138
+ # テストデータセット
139
+ dataset = [
140
+ {"conversations": [{"content": "火焔猫燐について教えてください。"}]},
141
+ {"conversations": [{"content": "水橋パルスィの本質は何ですか?"}]},
142
+ {"conversations": [{"content": "プログラミング初心者へのアドバイスをお願いします。"}]}
143
+ ]
144
+
145
+ # 2番目のデータセットエントリーで試してみる
146
+ response = generate_response(dataset[2])
147
+
148
+ print("入力:", dataset[2]["conversations"][0]['content'])
149
+ print("応答:", response)
150
+ ```
151
+
152
+ **解説**:
153
+ サンプルの実行方法を示しています:
154
+ - テスト用のデータセットを定義
155
+ - 選択したエントリーで応答を生成
156
+ - 入力と生成された応答を表示
157
+
158
+ このコードを使用することで、UnslothでファインチューニングしたカスタムのデータセットでトレーニングしたLLaMA 3.2モデルを、高速に推論できます。LLaMA 3.1のトークナイザーを使用することで、新しいモデルでも安定した出力が得られます。必要に応じて生成パラメータを調整することで、モデルの応答特性をカスタマイズできます。