Holy-fox commited on
Commit
952525e
·
verified ·
1 Parent(s): acacc20

Update README.md

Browse files
Files changed (1) hide show
  1. README.md +31 -164
README.md CHANGED
@@ -18,182 +18,49 @@ license: gemma
18
 
19
  ## How to use
20
 
21
- このモデルは、いくつかの方法で使用できます。以下に代表的な使用例を示します。
22
-
23
- ### 1. vLLM を使用した推論
24
-
25
- [vLLM](https://github.com/vllm-project/vllm) は、LLM の推論とサービングを高速化するためのライブラリです。
26
-
27
- ```sh
28
- pip install vllm transformers torch accelerate
29
- ```
30
 
31
  ```python
32
- from vllm import LLM, SamplingParams
33
- from transformers import AutoTokenizer
34
-
35
- # モデルID
36
- model_id = "DataPilot/ArrowMint-Gemma3-4B-ChocoMint-code"
37
-
38
- # Gemma 3 instruction-tuned 形式のチャットテンプレートを適用
39
- messages = [
40
- {"role": "user", "content": "Pythonで与えられたリスト内の偶数のみを返す関数を書いてください。"},
41
- ]
42
- tokenizer = AutoTokenizer.from_pretrained(model_id)
43
- prompt = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
44
-
45
- # LLMのロード (Gemma 3 は trust_remote_code=True が必要な場合があります)
46
- # 必要に応じて tensor_parallel_size を調整してください
47
- llm = LLM(model=model_id, trust_remote_code=True)
48
-
49
- # サンプリングパラメータ
50
- sampling_params = SamplingParams(
51
- temperature=0.1, # コード生成では少し低めの温度設定が有効な場合があります
52
- top_p=0.9,
53
- max_tokens=256 # 生成する最大トークン数
54
- )
55
-
56
- # 推論実行
57
- outputs = llm.generate(prompt, sampling_params)
58
-
59
- # 結果の表示
60
- for output in outputs:
61
- generated_text = output.outputs[0].text
62
- print("--- モデルの応答 ---")
63
- print(generated_text)
64
- print("--------------------")
65
-
66
- # --- モデルの応答 ---
67
- # def get_even_numbers(numbers):
68
- # """
69
- # 与えられたリスト内の偶数のみをリストとして返します。
70
- #
71
- # Args:
72
- # numbers: 数値のリスト
73
- #
74
- # Returns:
75
- # 偶数のみを含む新しいリスト
76
- # """
77
- # even_numbers = []
78
- # for number in numbers:
79
- # if number % 2 == 0:
80
- # even_numbers.append(number)
81
- # return even_numbers
82
- #
83
- # # 例:
84
- # my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
85
- # evens = get_even_numbers(my_list)
86
- # print(f"元のリスト: {my_list}")
87
- # print(f"偶数のリスト: {evens}")
88
- # --------------------
89
- ```
90
- *注意: vLLM のバージョンや環境によっては、Gemma 3 モデルのロードやチャットテンプレートの扱いに対応していない場合があります。最新の vLLM ドキュメントを参照してください。*
91
 
92
- ### 2. Transformers を使用した推論 (テキストのみ)
93
-
94
- `transformers` ライブラリを使用して、テキストプロンプト(システムプロンプトを含む)からテキストを生成します。
95
-
96
- ```sh
97
- pip install transformers torch accelerate bitsandbytes # bitsandbytes は量子化に必要
98
- ```
99
-
100
- ```python
101
- from transformers import AutoTokenizer, Gemma3ForConditionalGeneration
102
  import torch
103
 
104
- # モデルID
105
  model_id = "DataPilot/ArrowMint-Gemma3-4B-ChocoMint-code"
106
- # 利用可能なデバイスを設定 (GPUがあれば "cuda", なければ "cpu")
107
- device = "cuda" if torch.cuda.is_available() else "cpu"
108
 
109
- # トークナイザーとモデルのロード
110
- # Gemma 3 は bfloat16 を推奨。メモリが少ない場合は 4bit 量子化を試す (load_in_4bit=True)
111
- tokenizer = AutoTokenizer.from_pretrained(model_id)
112
  model = Gemma3ForConditionalGeneration.from_pretrained(
113
- model_id,
114
- torch_dtype=torch.bfloat16, # または torch.float16
115
- device_map="auto", # 自動でデバイス割り当て (GPU推奨)
116
- # load_in_4bit=True, # メモリ削減のために4bit量子化する場合
117
- )
118
 
119
- # チャット形式のプロンプト (システムプロンプトで役割を指定)
120
  messages = [
121
- {"role": "system", "content": "あなたは熟練したソフトウェアエンジニアとして振る舞うAIアシスタントです。"},
122
- {"role": "user", "content": "JavaScriptで、配列内の重複する要素を削除する効率的な方法を教えてください。"},
 
 
 
 
 
 
 
 
123
  ]
124
 
125
- # プロンプトをモデル入力形式に変換
126
- # Gemma 3 instruction-tuned モデルでは add_generation_prompt=True が重要
127
- inputs = tokenizer.apply_chat_template(
128
- messages,
129
- tokenize=True,
130
- add_generation_prompt=True,
131
- return_tensors="pt"
132
- ).to(model.device) # モデルと同じデバイスに配置
133
-
134
- # 推論の実行
135
- outputs = model.generate(
136
- inputs,
137
- max_new_tokens=512, # 生成する最大トークン数
138
- do_sample=True,
139
- temperature=0.7,
140
- top_p=0.95,
141
- )
142
-
143
- # 生成されたテキストのみをデコード
144
- # プロンプト部分を除いてデコード
145
- input_len = inputs.shape[-1]
146
- response = tokenizer.decode(outputs[0][input_len:], skip_special_tokens=True)
147
-
148
- print("--- モデルの応答 ---")
149
- print(response)
150
- print("--------------------")
151
-
152
- # --- モデルの応答 ---
153
- # JavaScriptで配列から重複する要素を削除する効率的な方法はいくつかありますが、`Set`オブジェクトを使うのが最も簡潔で推奨される方法の一つです。`Set`は一意の値しか保持しないコレクションです。
154
- #
155
- # ```javascript
156
- # function removeDuplicates(arr) {
157
- # // Setオブジェクトに配列を渡すと、重複が自動的に削除されます。
158
- # // その後、スプレッド構文(...)またはArray.from()を使ってSetを新しい配列に変換します。
159
- # return [...new Set(arr)];
160
- # }
161
- #
162
- # // 使用例
163
- # const myArray = [1, 2, 'a', 3, 'b', 2, 4, 'a', 5];
164
- # const uniqueArray = removeDuplicates(myArray);
165
- #
166
- # console.log("元の配列:", myArray); // -> [1, 2, 'a', 3, 'b', 2, 4, 'a', 5]
167
- # console.log("重複削除後の配列:", uniqueArray); // -> [1, 2, 'a', 3, 'b', 4, 5]
168
- # ```
169
- #
170
- # **他の方法:**
171
- #
172
- # 1. **`filter()` と `indexOf()`:**
173
- # ```javascript
174
- # function removeDuplicatesFilter(arr) {
175
- # return arr.filter((item, index) => arr.indexOf(item) === index);
176
- # }
177
- # ```
178
- # この方法は、配列の各要素に対して`indexOf`を呼び出すため、大きな配列では`Set`を使う方法よりもパフォーマンスが劣る可能性があります。
179
- #
180
- # 2. **`reduce()`:**
181
- # ```javascript
182
- # function removeDuplicatesReduce(arr) {
183
- # return arr.reduce((acc, current) => {
184
- # if (!acc.includes(current)) {
185
- # acc.push(current);
186
- # }
187
- # return acc;
188
- # }, []);
189
- # }
190
- # ```
191
- # この方法も`includes`が内部的にループするため、大きな配列では効率が良くありません。
192
- #
193
- # **結論:**
194
- #
195
- # ほとんどの場合、**`Set`を使用する方法が最も効率的で読みやすい**ため、推奨されます。
196
- # --------------------
197
  ```
198
 
199
  ## License
 
18
 
19
  ## How to use
20
 
21
+ このモデルは以下の方法で使えます。
 
 
 
 
 
 
 
 
22
 
23
  ```python
24
+ # pip install accelerate
25
+ # pip install -U transformers
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
26
 
27
+ from transformers import AutoProcessor, Gemma3ForConditionalGeneration
 
 
 
 
 
 
 
 
 
28
  import torch
29
 
 
30
  model_id = "DataPilot/ArrowMint-Gemma3-4B-ChocoMint-code"
 
 
31
 
 
 
 
32
  model = Gemma3ForConditionalGeneration.from_pretrained(
33
+ model_id, device_map="auto"
34
+ ).eval()
35
+
36
+ processor = AutoProcessor.from_pretrained(model_id)
 
37
 
 
38
  messages = [
39
+ {
40
+ "role": "system",
41
+ "content": [{"type": "text", "text": "あなたは素晴らしいアシスタントです。"}]
42
+ },
43
+ {
44
+ "role": "user",
45
+ "content": [
46
+ {"type": "text", "text": "strawberryのRを数えるコードをPythonで考えてください。"}
47
+ ]
48
+ }
49
  ]
50
 
51
+ inputs = processor.apply_chat_template(
52
+ messages, add_generation_prompt=True, tokenize=True,
53
+ return_dict=True, return_tensors="pt"
54
+ ).to(model.device, dtype=torch.bfloat16)
55
+
56
+ input_len = inputs["input_ids"].shape[-1]
57
+
58
+ with torch.inference_mode():
59
+ generation = model.generate(**inputs, max_new_tokens=100, do_sample=False)
60
+ generation = generation[0][input_len:]
61
+
62
+ decoded = processor.decode(generation, skip_special_tokens=True)
63
+ print(decoded)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
64
  ```
65
 
66
  ## License