dockerでGPTQ量子化されたLLMを動かす
はじめに
これまでLlama.cppを用いた量子化されたモデルの動かし方を紹介してきました。[1][2]
この記事では、GPTQ量子化でLLMで動かしてみます。
私の PC のスペック[3]
- i7 13700K
- 3090 24GB
- DDR5 128GB
dockerの実行環境を用意
VSCodeのDev Containersを使って、Dockerの実行環境を準備します。GPUを用いたdockerのインストール方法は以前記事にしたした。[1:1]
dockerがインストールされたサーバに対して、VSCodeからSSHをします。.vscode
ディレクトに以下のファイルを作成します。Build Containerを選択すると、Dockerのビルドが始まり環境構築ができます。
FROM huggingface/transformers-all-latest-gpu
ARG USERNAME=vscode
ARG USER_UID=1000
ARG USER_GID=$USER_UID
RUN groupadd --gid $USER_GID $USERNAME \
&& useradd --uid $USER_UID --gid $USER_GID -m $USERNAME \
&& rm /etc/apt/sources.list.d/cuda.list \
&& apt-get clean \
&& apt-get update \
&& apt-get install -y sudo \
&& echo $USERNAME ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME \
&& chmod 0440 /etc/sudoers.d/$USERNAME
USER $USERNAME
ベースイメージとしては、huggingface/transformers-all-latest-gpu
を使っています。このイメージにはpytorchやtensorflowやjupyterlabなどが入っており、HuggingFaceのモデルを動かすのに必要なものが揃っています。
{
"name": "huggingface",
"dockerFile": "Dockerfile",
"runArgs":[ "--gpus", "all"],
"postCreateCommand": "pip3 install tqdm jupyterlab ipywidgets",
"customizations": {
"vscode": {
"settings": {
"terminal.integrated.defaultProfile.linux": "bash"
},
"extensions": [
"ms-toolsai.jupyter",
"ms-python.python",
"ms-toolsai.vscode-jupyter-powertoys"
]
}
},
"remoteUser": "vscode",
"mounts": [
"source=/home/<username>/.cache,target=/home/vscode/.cache,type=bind,consistency=cached"
]
}
キャッシュを共有するために、.cache
をマウントしています。これによってコンテナを作り直すたびにモデルをダウンロードするのを防ぎます。<username>は、実際のユーザ名に置き換えてください。
これで、HuggingFaceのモデルを動かすためのDocker環境が構築できました。
モデルを動かす
今回は、TheBloke/Xwin-LM-13B-V0.1-GPTQ
を動かしてみます。
以下のコードで動かすことができます。
from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline, AutoConfig
model_name_or_path = "TheBloke/Xwin-LM-13B-V0.1-GPTQ"
config = AutoConfig.from_pretrained(model_name_or_path)
config.quantization_config["disable_exllama"] = False
config.quantization_config["exllama_config"] = {"version":2}
model = AutoModelForCausalLM.from_pretrained(model_name_or_path,
device_map="auto",
trust_remote_code=True,
revision="main",
config=config)
tokenizer = AutoTokenizer.from_pretrained(model_name_or_path, use_fast=True)
prompts = [
"素因数分解について説明してください。",
"コンピューターの基本的な構成要素は何ですか?",
"素因数分解する Python コードを書いて"
]
prompt_template=f'''{prompts[2]}
'''
print("\n\n*** Generate:")
input_ids = tokenizer(prompt_template, return_tensors='pt').input_ids.cuda()
output = model.generate(inputs=input_ids, temperature=0.7, do_sample=True, top_p=0.95, top_k=40, max_new_tokens=512)
print(tokenizer.decode(output[0]))
結果
これまでの記事と同じ質問をしてみます。
質問 1
「素因数分解について説明してください。」
素因数分解について説明してください。
from sympy import *
def factorize(n):
if n == 1:
return [1]
if n == 0:
return []
if n < 0:
return factorize(-n)
if n == 1:
return [1]
if n % 2 == 0:
return factorize(n // 2) + [2]
else:
return factorize(n - 1) + [2, n]
n = Symbol('n', integer=True)
factor_list = factorize(n)
print(factor_list)
このコードは、入力された整数を素因数に分解する関数
factorize
を定義しています。factor_list
には、n
の素因数のリストが格納されます。例えば、n = 6
の場合、factor_list
には[2, 3]
が格納されます。このコードを使用すると、指定された整数を素因数に分解することができます。ただし、このコードは、整数の素因数を効略的に分解することを目的としていません。すなわち、このコードは、
n
の素因数をすべて含む最小の整数を探索することを目的としています。これは、素因数分解の効略化を行う場合には不適切です。</s>
謎の再帰関数を示してきた。
質問 2
「コンピューターの基本的な構成要素は何ですか?」
コンピューターの基本的な構成要素は何ですか?
コンピューターの基本的な構成要素は、以下の通りです。
- ハードウェア (Hardware)
- プロセッサ (CPU)
- メモリ (RAM)
- ストレージ (Storage)
- グラフィックス (GPU)
- ネットワーク・インターフェイス (Network Interface)
- ソフトウェア (Software)
- オペレーティング・システム (Operating System)
- アプリケーション・ソフトウェア (Application Software)
- データベース (Database)
- ライブラリ (Library)
- ドライバ (Driver)
これらの要素は、コンピューターの機能と性能を構成し、ユーザーが処理や情報処理を行うためのツールとなります。
キーワードの列挙はしてくれたが、その説明はない。
質問 3
「素因数分解する Python コードを書いて」
素因数分解する Python コードを書いて
is_prime
関数を修正し、素因数分解を行うようにしてください。
def is_prime(number):
if number <= 1:
return False
if number == 2 or number == 3:
return True
if number % 2 == 0 and number != 2:
return is_prime(number // 2)
if number % 3 == 0 and number != 3:
return is_prime(number // 3)
return False
このコードを使用して、
is_prime
関数を素因数分解を行うように修正してください。注意: この問題では、
is_prime
関数を修正するだけであり、他のコードを書くことはないでしょう。
書いてくれなかった。
おわりに
Docker環境でHuggingFaceのモデルを動かす方法を紹介し、その中でGPTQ量子化のモデルを動かしました。個人的にはLlama.cppの方が好きではある。Llama.cppの方が使いやすい気がする。
Discussion