Intel MacでGPUを使わずに大規模言語モデルと戯れてみた
「Mac mini Late 2018 のRAMを64GBに換装してみた」に書きましたが、PCローカルで大規模言語モデルを使って遊ぶために、ちょうどRAMの相場が下がっていますし、Mac mini Late 2018のRAMをMAX値64GBに増設しました。いよいよリンナちゃんと会話できますよ。
Mac mini Late 2018
3.2GHz 6 cores Intel Core i7
64GB 2667MHz DDR4
Ventura 13.4.1
きっかけは、
自宅PCで「rinna」の日本語言語モデルを試用、メモリ32GBあればCPUだけでも動くぞ!: 清水理史の「イニシャルB」
オープンなLLMをDockerで動かす
を読んだことです。この記事のやり方を試してみたところ、16GBではメモリが足らなくてプロセスがKillされたため、メモリを増設したわけです。
私はLimaとDockerを使ってますので、メモリを増設した後、docker-rootful.yamlにて、以下のようにパラメータ設定を追加しました。
cpus: 10
memory: "30GiB"
disk: "200GiB"
ハードウェア環境に応じて設定すればいいと思います。なぜか、memoryを32GiBとか大きくするとうまくいきませんでした。
karaage0703/ChatLLMを利用するとお手軽に試してみることができます。Dockerfileに少し手を入れて次のようにしました。
FROM ubuntu:20.04
RUN apt-get update && apt-get upgrade -y
RUN apt-get install -y git python3 python3-pip
RUN pip install tokenizers>=0.13.2 prompt_toolkit numpy torch
RUN pip install transformers accelerate sentencepiece colorama
RUN pip install protobuf==3.19.6
protobufのバージョンを指定しないとうまくいきませんでした。CPUで動作させる場合は、
$ cd ~/ChatLLM
$ docker run -it -v $(pwd):/root ubuntu:ChatLLM
次のように実行します。
root@hostname:/# cd /root
root@hostname:~# python3 chat_calm.py
root@hostname:~# python3 chat_rinna.py
こうしてサイバーエージェントとリンナのLLMを気軽に試すことができます。ありがとうございます。私は、他のライブラリ利用やssh接続を考えて、以下のようなDockefileとdocker-compose.yamlを作成しました。ローカルで運用することもあってroot運用にしていますのでご承知おきください。(セキュリティ上問題ある場合は適宜変更してください。)
Dockerfile:
FROM debian:11.6-slim
LABEL maintainer “tonop”
# Install dependencies
RUN apt-get update && apt-get install -y \
openssh-server
RUN mkdir /var/run/sshd
RUN echo 'root:hoge' | chpasswd
RUN echo 'PasswordAuthentication yes' >> /etc/ssh/sshd_config
RUN echo 'PermitRootLogin yes' > /etc/ssh/sshd_config
RUN echo 'Port 22' >> /etc/ssh/sshd_config
RUN echo 'Protocol 2' >> /etc/ssh/sshd_config
RUN echo 'export LC_ALL=C' >> /root/.bashrc
# SSH login fix. Otherwise user is kicked off after login
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so
@g' -i /etc/pam.d/sshd
# For installing applications
RUN apt-get install -y \
apt-utils \
less \
vim \
wget \
git \
python3 \
python3-pip && \
rm -rf /var/lib/apt/lists/*
RUN pip install tokenizer>=0.13.2 prompt_toolkit numpy torch
RUN pip install transformers accelerate sentencepiece colorama
RUN pip install protobuf==3.19.6
RUN pip install ctranslate2
# port
EXPOSE 22
# Run sshd daemon
CMD ["/usr/sbin/sshd", "-D"]
# EOF
docker-compose.yaml:
version: "3"
services:
chatllmssh:
build: .
image: chatllmssh
container_name: chatllmssh
user: root
volumes:
- /Volumes/tonopSSD/tonop/work:/root/work
ports:
- "22000:22"
こんなふうにsshからログインして各プログラムを実行します。
$ docker-compose up -d
$ ssh -p 22000 root@127.0.0.1
CTranslate2を利用すると、Transformerを軽量に利用することができるとのことです。
RinnaのppoモデルをCTranslate2で高速に動かす
CTranslate2でRinnaモデルをコンバートしてCPUや8GB GPUで動くようにする
ありがとうございます。
CTranslate2を使ってリンナ言語モデルを量子化して利用可能です。
CTtanslate2形式にコンバート:
$ ct2-transformers-converter --model rinna/japanese-gpt-neox-3.66-instruction-ppo --output_dir rinnna-ppo-ct2-f32
CTtanslate2形式かつint8に量子化してコンバート:
$ ct2-transformers-converter --model rinna/japanese-gpt-neox-3.66-instruction-ppo --quantization int8 --output_dir rinnna-ppo-ct2-int8
int8量子化言語モデルを利用してリンナちゃんと会話するには次のプログラムを使いました。
import ctranslate2
import transformers
from colorama import Fore, Back, Style, init
init(autoreset=True)
model_name = "rinna/japanese-gpt-neox-3.6b-instruction-ppo"
ct2_model = "rinna-ppo-ct2-int8"
generator = ctranslate2.Generator(ct2_model, device="auto", inter_threads=10, intra_threads=0)
tokenizer = transformers.AutoTokenizer.from_pretrained(model_name, use_fast=False, cache_dir="./")
messages = []
MAX_TOKENS = 2048
def encode_prompt(messages):
prompt = "".join(messages)
prompt += "システム: "
tokens = tokenizer.convert_ids_to_tokens(tokenizer.encode(prompt, add_special_tokens=False))
return tokens
def trim_messages(messages, max_tokens):
tokens = encode_prompt(messages)
while len(tokens) > max_tokens:
messages.pop(0)
tokens = encode_prompt(messages)
return messages
while True:
input_text = input('> ')
messages.append('ユーザー: ' + input_text)
messages = trim_messages(messages, MAX_TOKENS)
tokens = encode_prompt(messages)
results = generator.generate_batch(
[tokens],
max_length=256,
sampling_topk=20,
sampling_temperature=0.7,
include_prompt_in_result=False,
)
output = tokenizer.decode(results[0].sequences_ids[0])
messages.append('システム: ' + output)
output = output.replace("", "\n")
print(Fore.YELLOW + 'リンナ: ' + output)
ただし、私が試したところ、スレッド数がフルに使えてない感じです。
あまりスペックが高くないPCでも大規模言語モデルが利用可能なツールとして、cppで実装したツールがあります。llama.cppやalpaca.cppが有名ですが、よりオープンなredpajama.cppがあります。
redpajama.cppを試す
真打登場。RedPajama-INCITE をつかったチャットを作ってみたら眠気も吹き飛びんだ
RedPajama-INCITE-3B, an LLM for everyone
このあたりをみながら試してみました。ありがとうございます。
togethercomputer/redpajama.cppからコードを入手します。Macにも対応していて簡単にmakeできます。こちらはDockerを使わずにMacのコマンドとして実行します。(ただし、モデルコンバートのときにはDocker上のPyTorch環境を併用しました。)
make
$ make redpajama redpajama-chat quantize-gptneox
デフォルトの使用言語モデルはRedPajama-INCITEです。examples/redpajama/scriptsに言語モデルインストール用のスクリプトinstall-RedPajama-INCITE-*.shがあるので実行します。さらに、量子化したモデルも用意します。次のコマンドで量子化できます。
$ python ./examples/redpajama/scripts/quantize-gptneox.py ./examples/redpajama/scripts/output_dir/[binファイル] --quantize-output-type q4_2 (q4_0, q4_1 ... q8_0)
ただし、quantize-gptneoxコマンドを使って直接量子化することもできると思います。
次に、例えば、下のchat.shを使ってチャットできます。引数は言語モデルbinファイルを指定してください。
#!/bin/bash
./redpajama-chat -m "$1" \
-c 2048 \
-b 128 \
-n 1 \
-t 10 \
--instruct \
--color \
--top_k 30 \
--top_p 0.95 \
--temp 0.8 \
--repeat_last_n 3 \
--repeat_penalty 1.1 \
--seed 0
軽いし、速いよ!
| 固定リンク
「パソコン・インターネット」カテゴリの記事
- 実家のAmazon Echo Show 5に別アカウントのAmazon Alexaアプリから呼びかけするためのAlexaアプリによる設定(2025.01.02)
- Intel Mac で ELYZA-japanese-Llama-2-13b 及び phi-2 とllama.cppで戯れてみた(2024.01.14)
- 分離型キーボードで親指シフト(NICOLA配列)を試す(Majestouch Xacro M10SP JIS配列)(2024.01.06)
- Microsoft Office Word のショートカットキーの一部をEmacs風のキーバインドにしてみた(2023.12.18)
- Intel Mac上でllama.cppのサーバ機能を使って日本語LLMを使ってみる(2023.11.12)
コメント