
WSL2でLlama3.2-1B/3B-Instructを試してみる
「1B および 3B サイズ (テキスト入力/テキスト出力) の事前トレーニング済みで命令調整済みの生成モデル」らしいLlama 3.2を試してみます。
とりあえず、普通のInstructモデルを試しましょう。
使用するPCはドスパラさんの「GALLERIA UL9C-R49」。スペックは
・CPU: Intel® Core™ i9-13900HX Processor
・Mem: 64 GB
・GPU: NVIDIA® GeForce RTX™ 4090 Laptop GPU(16GB)・GPU: NVIDIA® GeForce RTX™ 4090 (24GB)
・OS: Ubuntu22.04 on WSL2(Windows 11)
です。
1. 準備
仮想環境の構築
python3 -m venv vllm
cd $_
source bin/activate
つづいて、パッケージのインストール。
pip install -U vllm
vLLMのインストール時にtorchやら依存関係必要なものは勝手にインストールされます。
ライセンスへの同意
LLAMA 3.2 COMMUNITY LICENSE AGREEMENTへの同意が必要となるので、モデルのダウンロードに先駆けて同意しておきましょう。

2. 流し込むコード
こちらを/path/to/query4vllm.pyとして保存します。
import sys
import argparse
from vllm import LLM, SamplingParams
from typing import List, Dict
import time
# argv
parser = argparse.ArgumentParser()
parser.add_argument("--model-path", type=str, default=None)
parser.add_argument("--no-chat", action='store_true')
parser.add_argument("--no-use-system-prompt", action='store_true')
parser.add_argument("--max-model-len", type=int, default=32768)
parser.add_argument("--tensor-parallel-size", type=int, default=1)
parser.add_argument("--gpu-memory-utilization", type=float, default=0.2)
parser.add_argument("--max-tokens", type=int, default=4096)
args = parser.parse_args(sys.argv[1:])
model_id = args.model_path
if model_id == None:
exit
is_chat = not args.no_chat
use_system_prompt = not args.no_use_system_prompt
max_new_tokens = args.max_tokens
tensor_parallel_size = args.tensor_parallel_size
max_model_len = args.max_model_len
gpu_memory_utilization = args.gpu_memory_utilization
# トークナイザーとモデルの準備
model = LLM(
model=model_id,
dtype="auto",
trust_remote_code=True,
tensor_parallel_size=tensor_parallel_size,
max_model_len=max_model_len,
#quantization="awq",
gpu_memory_utilization=gpu_memory_utilization
)
tokenizer = model.get_tokenizer()
DEFAULT_SYSTEM_PROMPT = "あなたは誠実で優秀な日本人のアシスタントです。"
def q(
user_query: str,
history: List[Dict[str, str]]=None
) -> List[Dict[str, str]]:
# generation params
generation_params = SamplingParams(
temperature=0.8,
top_p=0.95,
top_k=40,
max_tokens=max_new_tokens,
repetition_penalty=1.1
)
#
start = time.process_time()
# messages
messages = ""
if is_chat:
messages = []
if use_system_prompt:
messages = [
{"role": "system", "content": DEFAULT_SYSTEM_PROMPT},
]
user_messages = [
{"role": "user", "content": user_query}
]
else:
user_messages = user_query
if history:
user_messages = history + user_messages
messages += user_messages
# generation prompts
if is_chat:
prompt = tokenizer.apply_chat_template(
conversation=messages,
add_generation_prompt=True,
tokenize=False
)
else:
prompt = messages
input_ids = tokenizer.encode(
prompt,
add_special_tokens=True,
)
print("--- prompt")
print(prompt)
print("--- output")
# 推論
outputs = model.generate(
sampling_params=generation_params,
prompt_token_ids=[input_ids],
)
print(outputs)
output = outputs[0]
print(output.outputs[0].text)
if is_chat:
user_messages.append(
{"role": "assistant", "content": output.outputs[0].text}
)
else:
user_messages += output.outputs[0].text
end = time.process_time()
##
input_tokens = len(output.prompt_token_ids)
output_tokens = len(output.outputs[0].token_ids)
total_time = end - start
tps = output_tokens / total_time
print(f"prompt tokens = {input_tokens:.7g}")
print(f"output tokens = {output_tokens:.7g} ({tps:f} [tps])")
print(f" total time = {total_time:f} [s]")
return user_messages
3. 試してみる
(1) meta-llama/Llama-3.2-1B-Instruct
1Bモデルに聞いてみます。
CUDA_VISIBLE_DEVICES=0 python -i /path/to/query4vllm.py \
--model-path meta-llama/Llama-3.2-1B-Instruct \
--max-model-len 4096 \
--gpu-memory-utilization 0.99
pythonプロンプトが表示されたら、聞きましょう。
>>> history = q("ドラえもんとはなにか")
--- prompt
<|begin_of_text|><|start_header_id|>system<|end_header_id|>
Cutting Knowledge Date: December 2023
Today Date: 27 Sep 2024
あなたは誠実で優秀な日本人のアシスタントです。<|eot_id|><|start_header_id|>user<|end_header_id|>
ドラえもんとはなにか<|eot_id|><|start_header_id|>assistant<|end_header_id|>
--- output
Processed prompts: 100%|███████████████████| 1/1 [00:02<00:00, 2.10s/it, est. speed input: 28.51 toks/s, output: 162.99 toks/s]
ドラえもん(ドルミン)は、1990年に公開された日本のファンコメ・スリラー映画です。監督は小栗健二(さがたけんじ)で、脚本と主演を務めた阿部伸によるファンコメであり、日本のファンコメ界に名声があります。
ドラえもんは、医師の小松克平(小松克平)が、有名な医者であるサラの息子であるドーラのことを大事にしたいという願望によって生まれることを物語する内容となります。ドーラは、薬物中毒により、精神的に衰退し、その母親が亡くなった後、さまざまな人々から助けることに意欲を持っています。
小松克平が医師となる前は、アッパーはマジックアンカーとして働いており、小松が彼らを支えようとする計画を行う。ドーラは、それに対して反対的心を集めながら、彼らの生活を理解しようとします。
この映画は、ハードボウルのストーリーに溶け込んだファンコメになりました。また、サラと小松の関係を描写し、医者としての役割を強調しています。
ドラえもんには、ハンドセッションやコメedyなどのトピックが含まれています。主なテーマは、人格論における病気や疎外的な心構造から医者の力を見つけることです。
ドラえもんです。
prompt tokens = 60
output tokens = 343 (163.582025 [tps])
total time = 2.096807 [s]
かなり斜め上に行ってますが面白いと言えば面白い。そして、さいごの一言がなんだかシュール。
(2) meta-llama/Llama-3.2-3B-Instruct
3Bモデルに聞いてみます。
CUDA_VISIBLE_DEVICES=0 python -i /path/to/query4vllm.py \
--model-path meta-llama/Llama-3.2-3B-Instruct \
--max-model-len 4096 \
--gpu-memory-utilization 0.99
pythonプロンプトが表示されたら、聞きましょう。
>>> history = q("ドラえもんとはなにか")
--- prompt
<|begin_of_text|><|start_header_id|>system<|end_header_id|>
Cutting Knowledge Date: December 2023
Today Date: 27 Sep 2024
あなたは誠実で優秀な日本人のアシスタントです。<|eot_id|><|start_header_id|>user<|end_header_id|>
ドラえもんとはなにか<|eot_id|><|start_header_id|>assistant<|end_header_id|>
--- output
Processed prompts: 100%|████████████████████| 1/1 [00:02<00:00, 2.90s/it, est. speed input: 20.73 toks/s, output: 94.30 toks/s]
ドラえもん(ドラえもん)は、フジテレビ系のアニメ作品で、日本の小説家と漫画家の福本潤二による人気の長年の manga と、1979年から放送されている anime です。
この作品は、未来から帰ってきた時計機関の運転手・ハートランドに乗った、人造人間であるドラえもんという小型ロボットが、現在の日本に活躍する様子を描いています。ドラえもんは、家族と一緒に生活することができるお金や時間-savingデバイスで、現代社会の生活の問題に対処し、かつては珍しいかつて無かった技術によって、さまざまな事象や事件を解決します。
これまでに、2000年以上のエピソードが作成されており、その中で多くの歴史的出来事や現代社会の問題に対処している。これらのエピソードは、さまざまなテーマや話題に関連しています。
1996年に日本国民の意見を集めたアンケートでは、ドラえもんを「家族と共に暮らすために使う、最も重要な存在」として選ばれています。
prompt tokens = 60
output tokens = 273 (94.340134 [tps])
total time = 2.893784 [s]
フジテレビに乗り換えてしまったのか…。そして、実は人造人間だったという異世界転生。
4. まとめ
ちょっと日本語(助詞、助動詞)が微妙なところがありますね。