見出し画像

WSL2でneuralmagic/Meta-Llama-3.1-8B-Instruct-FP8をvLLMと共に試してみる

「Meta-Llama-3.1-8B-Instruct の重みと活性化を FP8データ型に量子化することで、vLLMで推論できる」らしい、neuralmagic/Meta-Llama-3.1-8B-Instruct-FP8をvLLMとともに試してみます。

使用する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. 準備

venv構築

python3 -m venv vllm
cd $_
source bin/activate

パッケージのインストール。

pip install torch transformers accelerate
pip install vllm

2. 流し込むコード

以下の内容を 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 = "あなたは誠実で優秀な日本人のアシスタントです。"

# generation params
generation_params = SamplingParams(
    temperature=0.8,
    top_p=0.95,
    top_k=40,
    max_tokens=max_new_tokens,
    repetition_penalty=1.1
)

def q(
    user_query: str,
    history: List[Dict[str, str]]=None
) -> List[Dict[str, str]]:
    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. 試してみる

実行する

以下の引数でpythonコマンドを実行します。

CUDA_VISIBLE_DEVICES=0 python -i ~/scripts/query4vllm.py \
    --model-path neuralmagic/Meta-Llama-3.1-8B-Instruct-FP8 \
    --max-model-len 16384 \
    --gpu-memory-utilization 0.6

max-model-lenは 16,384、gpu-memory-utilizationは60%を指定しています。

※Llama 3.1のmax-model-lenは131,072 ですが、VRAM 24GBですと厳しいので小さな数値にしています。

VRAM使用量は12.9GBです。

聞いてみる

いつものとおり聞いてましょう。

>>> history = q("ドラえもんとはなにか")
--- prompt
<|begin_of_text|><|start_header_id|>system<|end_header_id|>

あなたは誠実で優秀な日本人のアシスタントです。<|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.78s/it, est. speed input: 14.06 toks/s, output: 60.93 toks/s]
[RequestOutput(request_id=0, prompt=None, prompt_token_ids=[128000, 128006, 9125, 128007, 271, 30591, 112568, 15682, 124097, 103350, 16556, 104622, 106241, 26854, 102433, 107707, 39880, 57207, 105335, 52414, 38641, 1811, 128009, 128006, 882, 128007, 271, 115173, 58942, 32977, 25827, 107118, 26854, 112649, 128009, 128006, 78191, 128007, 271], prompt_logprobs=None, outputs=[CompletionOutput(index=0, text='お名前を言いましたね! ドラえもんとは、人気の漫画やアニメ作品です。\nドラえもんは、未来からタイムマシンを使って来た謎の老人のかめさんのペットである黄色い 猫です。\nかめさんは、時には子どもたちに未来の技術を貸与し、お悩みを解決してくれる助ける存在となります。\nドラえもんは、各種の道具を持っていることで知られており、「空を飛ぶスーツ」、「食 べ物が増殖する器」などの超能力を持った道具などが多数あります。\nこのようなユニークな設定と、ドラえもの愛されるキャラクターによって、世界中の人々に愛されている漫画やアニメ作品です。', token_ids=(33334, 120613, 30512, 120267, 79721, 101832, 6447, 113102, 32131, 58942, 32977, 25827, 107118, 5486, 126909, 16144, 123488, 71289, 127949, 106942, 38641, 9174, 115173, 58942, 32977, 25827, 15682, 5486, 120987, 55031, 107507, 91062, 68759, 57207, 16073, 124905, 76947, 124284, 105037, 236, 16144, 92877, 17792, 104865, 62004, 115867, 99695, 67075, 103195, 105310, 39135, 16995, 108429, 38641, 9174, 32149, 62004, 117940, 5486, 39177, 102052, 45829, 67645, 32977, 105459, 20230, 120987, 16144, 112113, 30512, 110726, 58318, 15024, 108948, 101128, 102, 64121, 30512, 50338, 104662, 39926, 124089, 103129, 105784, 48706, 121711, 33541, 9174, 115173, 58942, 32977, 25827, 15682, 5486, 102208, 104091, 16144, 45893, 77913, 114792, 103836, 118733, 53283, 124195, 108086, 36896, 35894, 30512, 107850, 104369, 22398, 109089, 10646, 36896, 125764, 53953, 29295, 115079, 125131, 54926, 32648, 10646, 123160, 72404, 106556, 114792, 100472, 45893, 77913, 104309, 29295, 43240, 9039, 57903, 33541, 9174, 51330, 105933, 108152, 78683, 105048, 26854, 116700, 19732, 5486, 115173, 58942, 102944, 103926, 107001, 107391, 119539, 102514, 113468, 5486, 102616, 16325, 124911, 104680, 20230, 103926, 110731, 123488, 71289, 127949, 106942, 38641, 1811, 128009), cumulative_logprob=None, logprobs=None, finish_reason=stop, stop_reason=None)], finished=True, metrics=RequestMetrics(arrival_time=1723725344.4656525, last_token_time=1723725344.4656525, first_scheduled_time=1723725344.4663806, first_token_time=1723725344.8006446, time_in_queue=0.0007281303405761719, finished_time=1723725347.2398367), lora_request=None)]
お名前を言いましたね! ドラえもんとは、人気の漫画やアニメ作品です。
ドラえもんは、未来からタイムマシンを使って来た謎の老人のかめさんのペットである黄色い猫です。
かめさんは、時には子どもたちに未来の技術を貸与し、お悩みを解決してくれる助ける存在となります。
ドラえもんは、各種の道具を持っていることで知られており、「空を飛ぶスーツ」、「食べ物が増殖する器」などの超能力を持った道具などが多数あります。
このようなユニークな設定と、ドラえもの愛されるキャラクターによって、世界中の人々に愛されている漫画やアニメ作品です。
prompt tokens = 39
output tokens = 169 (60.913582 [tps])
   total time = 2.774422 [s]
>>>

お名前を言いましたね! ドラえもんとは、人気の漫画やアニメ作品です。
ドラえもんは、未来からタイムマシンを使って来た謎の老人のかめさんのペットである黄色い猫です。
かめさんは、時には子どもたちに未来の技術を貸与し、お悩みを解決してくれる助ける存在となります。
ドラえもんは、各種の道具を持っていることで知られており、「空を飛ぶスーツ」、「食べ物が増殖する器」などの超能力を持った道具などが多数あります。
このようなユニークな設定と、ドラえもの愛されるキャラクターによって、世界中の人々に愛されている漫画やアニメ作品です。

neuralmagic/Meta-Llama-3.1-8B-Instruct-FP8

謎の老人かめさんの黄色い猫のペットが、ドラえもんらしい。かめさんが気になるので、追加で質問してみます。

>>> history = q("かめさんとはなにか", history)
--- prompt
<|begin_of_text|><|start_header_id|>system<|end_header_id|>

あなたは誠実で優秀な日本人のアシスタントです。<|eot_id|><|start_header_id|>user<|end_header_id|>

ドラえもんとはなにか<|eot_id|><|start_header_id|>assistant<|end_header_id|>

お名前を言いましたね! ドラえもんとは、人気の漫画やアニメ作品です。
ドラえもんは、未来からタイムマシンを使って来た謎の老人のかめさんのペットである黄色い猫です。
かめさんは、時には子どもたちに未来の技術を貸与し、お悩みを解決してくれる助ける存在となります。
ドラえもんは、各種の道具を持っていることで知られており、「空を飛ぶスーツ」、「食べ物が増殖する器」などの超能力を持った道具などが多数あります。
このようなユニークな設定と、ドラえもの愛されるキャラクターによって、世界中の人々に愛されている漫画やアニメ作品です。<|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.58s/it, est. speed input: 86.53 toks/s, output: 60.15 toks/s]
[RequestOutput(request_id=1, prompt=None, prompt_token_ids=[128000, 128006, 9125, 128007, 271, 30591, 112568, 15682, 124097, 103350, 16556, 104622, 106241, 26854, 102433, 107707, 39880, 57207, 105335, 52414, 38641, 1811, 128009, 128006, 882, 128007, 271, 115173, 58942, 32977, 25827, 107118, 26854, 112649, 128009, 128006, 78191, 128007, 271, 33334, 120613, 30512, 120267, 79721, 101832, 6447, 113102, 32131, 58942, 32977, 25827, 107118, 5486, 126909, 16144, 123488, 71289, 127949, 106942, 38641, 9174, 115173, 58942, 32977, 25827, 15682, 5486, 120987, 55031, 107507, 91062, 68759, 57207, 16073, 124905, 76947, 124284, 105037, 236, 16144, 92877, 17792, 104865, 62004, 115867, 99695, 67075, 103195, 105310, 39135, 16995, 108429, 38641, 9174, 32149, 62004, 117940, 5486, 39177, 102052, 45829, 67645, 32977, 105459, 20230, 120987, 16144, 112113, 30512, 110726, 58318, 15024, 108948, 101128, 102, 64121, 30512, 50338, 104662, 39926, 124089, 103129, 105784, 48706, 121711, 33541, 9174, 115173, 58942, 32977, 25827, 15682, 5486, 102208, 104091, 16144, 45893, 77913, 114792, 103836, 118733, 53283, 124195, 108086, 36896, 35894, 30512, 107850, 104369, 22398, 109089, 10646, 36896, 125764, 53953, 29295, 115079, 125131, 54926, 32648, 10646, 123160, 72404, 106556, 114792, 100472, 45893, 77913, 104309, 29295, 43240, 9039, 57903, 33541, 9174, 51330, 105933, 108152, 78683, 105048, 26854, 116700, 19732, 5486, 115173, 58942, 102944, 103926, 107001, 107391, 119539, 102514, 113468, 5486, 102616, 16325, 124911, 104680, 20230, 103926, 110731, 123488, 71289, 127949, 106942, 38641, 1811, 128009, 128006, 882, 128007, 271, 32149, 62004, 98369, 107118, 26854, 112649, 128009, 128006, 78191, 128007, 271], prompt_logprobs=None, outputs=[CompletionOutput(index=0, text='かめさんとは、ドラえもんシリーズの中で登場する重要な人物です。\n\nかめさんは、地球最後の100年後という未来から、タメち ゃん(ドラえもん)を連れてきた老人で、時計じかけのような外見をしています。その正体は、昔から伝説となっている「神様」とされています。\n\nかめさんは、大変な性格ですが、ドライな表面がありな がらも子供たちのために尽くす意志が強い人物です。\n\nかめさんは、自分が行方不明になった際に、タメちゃんに地球最後の100年後の状況について教え、それを元にドラえもんシリーズは展開されてきています。', token_ids=(32149, 62004, 98369, 107118, 5486, 115173, 58942, 32977, 25827, 114971, 107809, 16556, 120955, 54926, 107693, 26854, 113679, 38641, 3490, 32149, 62004, 117940, 5486, 127960, 114626, 16144, 1041, 8107, 74482, 102677, 120987, 55031, 5486, 47307, 39850, 108056, 10110, 115173, 58942, 32977, 25827, 7705, 30512, 89046, 106824, 105898, 92877, 17792, 16556, 5486, 39177, 82420, 100204, 126929, 120950, 48915, 91774, 30512, 127145, 109807, 37656, 33014, 15682, 5486, 11881, 242, 55031, 108044, 108323, 104856, 103836, 13177, 101365, 103826, 66383, 116216, 61689, 3490, 32149, 62004, 117940, 110745, 104721, 26854, 34171, 35083, 119627, 5486, 45923, 102803, 26854, 21405, 28190, 115991, 106272, 32977, 127032, 126027, 113009, 107542, 47884, 17663, 37689, 78228, 29295, 104195, 16995, 113679, 38641, 3490, 32149, 62004, 117940, 5486, 105994, 29295, 23039, 24273, 16937, 31958, 110276, 104983, 20230, 5486, 47307, 39850, 108056, 20230, 127960, 114626, 16144, 1041, 8107, 123470, 127749, 109853, 100927, 58942, 108048, 30512, 24186, 20230, 115173, 58942, 32977, 25827, 114971, 15682, 77413, 87447, 116216, 50834, 127280, 1811, 128009), cumulative_logprob=None, logprobs=None, finish_reason=stop, stop_reason=None)], finished=True, metrics=RequestMetrics(arrival_time=1723725458.3987021, last_token_time=1723725458.3987021, first_scheduled_time=1723725458.3990998, first_token_time=1723725458.7229586, time_in_queue=0.00039768218994140625, finished_time=1723725460.9759865), lora_request=None)]
かめさんとは、ドラえもんシリーズの中で登場する重要な人物です。

かめさんは、地球最後の100年後という未来から、タメちゃん(ドラえもん)を連れてきた老人で、時計じかけのような外見をしています。その正体は、昔から伝説となっている「神様」とされています。

かめさんは、大変な性格ですが、ドライな表面がありながらも子供たちのために尽くす意志が強い人物です。

かめさんは、自分が行方不明になった際に、タメちゃんに地球最後の100年後の状況について教え、それを元にドラえもんシリーズは展開されてきています。
prompt tokens = 223
output tokens = 155 (59.929489 [tps])
   total time = 2.586373 [s]

かめさんとは、ドラえもんシリーズの中で登場する重要な人物です。

かめさんは、地球最後の100年後という未来から、タメちゃん(ドラえもん)を連れてきた老人で、時計じかけのような外見をしています。その正体は、昔から伝説となっている「神様」とされています。

かめさんは、大変な性格ですが、ドライな表面がありながらも子供たちのために尽くす意志が強い人物です。

かめさんは、自分が行方不明になった際に、タメちゃんに地球最後の100年後の状況について教え、それを元にドラえもんシリーズは展開されてきています。

neuralmagic/Meta-Llama-3.1-8B-Instruct-FP8

次はためちゃんなる人物が。

かめさんとは、ドラえもんシリーズの中で登場する重要な人物です。

かめさんは、地球最後の100年後という未来から、タメちゃん(ドラえもん)を連れてきた老人で、時計じかけのような外見をしています。その正体は、昔から伝説となっている「神様」とされています。

かめさんは、大変な性格ですが、ドライな表面がありながらも子供たちのために尽くす意志が強い人物です。

かめさんは、自分が行方不明になった際に、タメちゃんに地球最後の100年後の状況について教え、それを元にドラえもんシリーズは展開されてきています。

タメちゃんとは、ドラえもんシリーズの中で非常に重要な役割を担う人物です。

タメちゃんは、正式名称はドラえもんです。それは、未来から送られた時計じかけのような外見をした老人で、ペットとして飼われている黄色い猫です。

タメちゃんは、人間離れした知能と超能力を持ち合わせており、時々人間の少年少女のように現れ、様々な問題を解決します。彼の持つ道具は、現代では考えられないほど先進的なものであり、その力を利用 して様々な困難を克服します。

タメちゃんは、かめさんが未来から連れて来て保護している子供です。

neuralmagic/Meta-Llama-3.1-8B-Instruct-FP8

回答内容は一貫しているのだが、いかんせん内容が・・・。

4. 限界に挑戦

Llama 3.1のmax-model-lenは131,072 (128k) と書きましたが、RTX 4090(24GB)だと、どこまで耐えられるか、タメしてみましょう。

GPUメモリをどれだけ割り当てるかによってmax-model-lenの値をどこまで指定できるか(=Max値)が決まります。

gpu-memory-utilization : 0.4 のとき

  • max-model-lenのMax値は 224 らしいのだが、これを指定してもロード時にエラーになる(起動不可)。

gpu-memory-utilization : 0.6 のとき

  • VRAM使用量: 14.1GB

  • max-model-lenのMax : 39536

gpu-memory-utilization : 0.8 のとき

  • VRAM使用量: 18.9GB

  • max-model-lenのMax : 78832

gpu-memory-utilization : 0.99 のとき

  • VRAM使用量 :  23.4GB

  • max-model-lenのMax : 116160

gpu-memory-utilization : 1.0 のとき

  • VRAM使用量 : 23.6GB となってしまって、溢れてしまってだんまり。

  • max-model-lenのMax : 118128

まとめると、

  • 0.99のとき116,160まで耐えられました

  • 1.0は指定してはいけません。

この記事が気に入ったらサポートをしてみませんか?