技術コラム
業界注目の日本発のローカルLLM

Tanuki-8x8Bを動かそう

はじめに

業界注目の日本発のローカルLLM「Tanuki」

こんにちは、ネクスティ エレクトロニクス開発部メンバーです。
筆者は、各種GPUサーバーの自由度の高いトライアルができる、 GPU Advenced Test Drive(GAT) の技術サポートを担当しています。

昨今、ChatGPTやGemini、Claudeなどのような言語生成AIの盛り上がりは、みなさまも目の当たりにしていることかと思います。
そんな中、自前の環境(ローカル)でこういった言語モデルを動かす、「ローカルLLM(Large Language Models、大規模言語モデル)」も進歩が目まぐるしいです。

このローカルLLM向けに、先日、純国産のTanukiが発表されました。
こちらのモデルは商用利用可能で、日本語の受け答えにおいては非常に精度も高く、注目度が高いです。

本コラムでは、2種の公開モデルうち、高精度版の「Tanuki-8x8B」をPCで実際に動かすまでの詳細手順や、 GATで取り扱っている各種GPUサーバーでも実際に試行し、 その簡易なベンチマークを記します。

必要なハードウェア

PC+GPUは、以下が必要です。

  • GPUは今回はNVIDIA社製のものを対象としています
  • GPUメモリは今回8x8B(のAWQ量子化版)を動かすため、40G程度は必要です
    GPUメモリが足りない場合は、本コラムでは割愛しますが、Tanuki-8Bの方だと動く可能性があります
  • GPU複数枚差しの場合、推奨のGPUの合計メモリ量が40G程度です
  • OSはUbuntuを基本としていますが、Windowsのwsl2でのUbuntuで動かす事ができます

ネクスティ エレクトロニクスでの動作確認に用いたPC環境は、以下の通りです。

  • Ubuntu 20.04.6 LTS
  • 13th Gen Intel Core i5-13600K
  • 128GB Memory
  • RTX6000Ada(48GB) Driver Version 535.183.01

事前準備(docker動作環境の構築)

事前準備として、docker(with GPU環境)をインストールしてください。

1. Ubuntuの場合

  • 公式のaptインストール手順がおすすめです。
  • その後、nvidia-container-toolkitのインストールが必要です(dockerからGPUを使えるようになります)

2. Windowsの場合

  • docker-desktop(Windows版)をインストールしておいてください
    (インストール時に「WSL2 Integration」を有効化しておけば、wslのUbuntuから利用できます)。
  • Windowsの場合は、nvidia-container-toolkitの追加インストールは不要です
  • wsl2にて、ubuntu20.04やubuntu22.04を使えるようにしておいてください

Dockerでの仮想vllm環境構築

Tanuki-8x8Bでは、改造版のvllmを使用します。
こちらを動かすことができる仮想環境を、Dockerにて用意します。

以下テキストを「Dockerfile」という名前で保存します。
(長いですが、右下のcopyボタンからクリップボードにコピーできるため、また以後プロンプト表記などを省いて、容易にコピー&ペーストできます。)


FROM nvidia/cuda:12.1.0-cudnn8-devel-ubuntu20.04
ENV DEBIAN_FRONTEND noninteractive
ENV CONDA_DIR /opt/conda
ENV PATH /usr/local/cuda/bin:$CONDA_DIR/bin:$PATH

#Env(for in docker build)
ENV CPATH /usr/local/cuda-12.1/include:$CPATH
ENV LIBRARY_PATH /usr/local/cuda-12.1/lib64:$LIBRARY_PATH 
ENV LD_LIBRARY_PATH /usr/local/cuda-12.1/lib64:$LD_LIBRARY_PATH 
ENV PATH /usr/local/cuda-12.1/bin:$PATH
ENV CUDA_HOME /usr/local/cuda-12.1

# System dependencies
RUN apt-get update && apt-get install -y \
    wget \
    build-essential g++ gcc \
    libgl1-mesa-glx libglib2.0-0 \
    openmpi-bin openmpi-common libopenmpi-dev libgtk2.0-dev git \
    gnupg2 curl software-properties-common \
    cmake \
    protobuf-compiler \
    libprotobuf-dev \
    && rm -rf /var/lib/apt/lists/*

# Install Miniconda
RUN wget --quiet https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda.sh && \
    /bin/bash ~/miniconda.sh -b -p $CONDA_DIR

# Python packages
RUN conda install -y python=3.10

# Python packages2
RUN pip install transformers accelerate bitsandbytes

# vLLM(modified) build and install
RUN git clone https://github.com/team-hatakeyama-phase2/vllm.git && \
    cd vllm && \
    LD_LIBRARY_PATH="" MAX_JOBS=16 pip install -e . && \
    pip install --no-build-isolation flash_attn
                

Dockerfileの軽い解説を以下に記します。

以下コマンドでdockerイメージを生成します。
-tの部分は何でも良いですが、作成されるイメージにあだ名を付けます。
(当記事内では「vllm-nexty」で説明します)

docker build . -f Dockerfile -t vllm-nexty
                

Tanuki-8x8Bを動かす

基本スクリプト

以下の基本実行を行うスクリプトを、vllm_test.py などの名前で、保存します。 保存先ディレクトリは「/home/xxx/tanuki」として説明します。

※このスクリプトの作成は、公式の推論方法の説明ページWSL2でTanuki-8x8B-dpo-v1.0を試してみるというページを参考にしました。


from time import time
from vllm import LLM, SamplingParams

#環境によっては、以下に書き換える必要あり
#from vllm.entrypoints.llm import LLM
#from vllm.sampling_params import SamplingParams

#モデル名 AWQ量子化版を利用
model_name = "team-hatakeyama-phase2/Tanuki-8x8B-dpo-v1.0-AWQ"
#model_name = "weblab-GENIAC/Tanuki-8x8B-dpo-v1.0"
#model_name = "team-hatakeyama-phase2/Tanuki-8x8B-dpo-v1.0-GPTQ-4bit"
#model_name = "team-hatakeyama-phase2/Tanuki-8x8B-dpo-v1.0-GPTQ-8bit"

#vllmの起動
#gpu_memory_utilizationの部分は、環境に合わせて調整(オーバーフロー発生時は割合を減らす)
vllm = LLM(model_name, trust_remote_code=True, tensor_parallel_size=1, gpu_memory_utilization=0.8)  # 1GPUの場合
#vllm = LLM(model_name, trust_remote_code=True, tensor_parallel_size=2)  # 2GPUを使う場合
tokenizer = vllm.get_tokenizer()

#入力の設定
messages = [
    {"role": "system", "content": "以下は、タスクを説明する指示です。要求を適切に満たす応答を書きなさい。"},
    {"role": "user", "content": "日本のおすすめの観光地を教えてください。"}
]

inputs_text = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
print(f"inputs_text: {inputs_text}")

sampling_params = SamplingParams(temperature=0.0, max_tokens=1024, seed=1, repetition_penalty=1.1)

#実行
start = time()
outputs = vllm.generate(inputs_text, sampling_params=sampling_params, use_tqdm=False)
end = time()

#表示
outputs_text = outputs[0].outputs[0].text
print(f"outputs_text: {outputs_text}")
print(f"Elapsed time: {(end - start):.4f} sec.")

#実行速度などを表示
input_tokens = len(outputs[0].prompt_token_ids)
output_tokens = len(outputs[0].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]")

#end of this program
                        

このプログラムを実行すると、以下が自動で動作します。

  • 1. (初回のみ)huggingfaceサイトから、Tanuki-8x8B(AWQ量子化版)の学習済モデルデータを自動的に、~/.cache/以下にロードします。
  • 2. 学習済モデルデータをGPU上に展開します。(25GB程度使用する様です)
  • 3. messagesの1つ目で役割の指定(公式の指定のままで)をし、2つ目で実際の質問の例(日本のオススメの観光地)を記載しており、vllmの入力に使われます。
  • 4. 入力に対する出力をテキスト表示し、また実行に掛かった時間、1秒辺りのトークン数(TPS)なども表示します。

こちらは先程のDockerfileで作成した、改造版のvllmがインストールしてある環境上で動きます。 早速実行してみましょう。

Dockerの起動・基本スクリプトの実行

先ほど生成したdockerイメージを、以下のスクリプトで起動します。


#!/bin/bash

D_WORK_DIR=/home/xxx/tanuki

docker run --rm --name vllm-nexty-run --gpus all -it --network host \
        -w "${D_WORK_DIR}" \
        -v "${D_WORK_DIR}":"${D_WORK_DIR}" \
        -v ~/.cache/huggingface:/root/.cache/huggingface \
        --shm-size 64g vllm-nexty /bin/bash
                

以下にdocker起動スクリプトの解説を記します。

  • D_WORK_DIRにて、上記の基本スクリプトを置いたディレクトリを、dockerと共有する設定にしています。
  • また、~/.cacheをdocker側と共有することで、学習済モデルデータの保存をdocker外と共通化しています。
  • --rmオプションで起動することで、終了時に残さない設定です(改造版vllmの動作環境としてのみ利用)。
  • vllm-nextyというdockerイメージを起動し、vllm-nexty-runというあだ名を付けています。

無事起動すると、以下のようなdocker内のrootプロンプトとなります。

root@machine:/home/xxx/tanuki# 
                        

ここで、共有した起動ディレクトリに置いてあります、「vllm_test.py」を実行します。

python vllm_test.py
                        

実行して、以下のような出力となれば成功です。


INFO 09-06 07:08:42 awq_marlin.py:89] The model is convertible to awq_marlin during runtime. Using awq_marlin kernel.
INFO 09-06 07:08:42 llm_engine.py:184] Initializing an LLM engine (v0.5.4) with config: model='team-hatakeyama-phase2/Tanuki-8x8B-dpo-v1.0-AWQ', speculative_config=None, tokenizer='team-hatakeyama-phase2/Tanuki-8x8B-dpo-v1.0-AWQ', skip_tokenizer_init=False, tokenizer_mode=auto, revision=None, rope_scaling=None, rope_theta=None, tokenizer_revision=None, trust_remote_code=True, dtype=torch.float16, max_seq_len=4096, download_dir=None, load_format=LoadFormat.AUTO, tensor_parallel_size=1, pipeline_parallel_size=1, disable_custom_all_reduce=False, quantization=awq_marlin, enforce_eager=False, kv_cache_dtype=auto, quantization_param_path=None, device_config=cuda, decoding_config=DecodingConfig(guided_decoding_backend='outlines'), observability_config=ObservabilityConfig(otlp_traces_endpoint=None, collect_model_forward_time=False, collect_model_execute_time=False), seed=0, served_model_name=team-hatakeyama-phase2/Tanuki-8x8B-dpo-v1.0-AWQ, use_v2_block_manager=False, enable_prefix_caching=False)
INFO 09-06 07:08:48 model_runner.py:886] Starting to load model team-hatakeyama-phase2/Tanuki-8x8B-dpo-v1.0-AWQ...
INFO 09-06 07:08:49 weight_utils.py:231] Using model weights format ['*.safetensors']
model-00006-of-00006.safetensors: 100%|████████████████████████████████████████████████████████████| 533M/533M [03:02<00:00, 2.23MB/s]
model-00005-of-00006.safetensors: 100%|██████████████████████████████████████████████████████████| 4.74G/4.74G [28:34<00:00, 2.67MB/s]
model-00004-of-00006.safetensors: 100%|██████████████████████████████████████████████████████████| 4.98G/4.98G [30:06<00:00, 2.68MB/s]
model-00002-of-00006.safetensors: 100%|██████████████████████████████████████████████████████████| 4.97G/4.97G [30:14<00:00, 2.66MB/s]
model-00003-of-00006.safetensors: 100%|██████████████████████████████████████████████████████████| 4.97G/4.97G [30:47<00:00, 2.60MB/s]
model-00001-of-00006.safetensors: 100%|██████████████████████████████████████████████████████████| 5.00G/5.00G [30:56<00:00, 2.62MB/s]
model.safetensors.index.json: 100%|█████████████████████████████████████████████████████████████████| 273k/273k [00:00<00:00, 603kB/s]
Loading safetensors checkpoint shards:   0% Completed | 0/6 [00:00<?, ?it/s]█████████████████████| 4.97G/4.97G [30:47<00:00, 6.64MB/s]
INFO 09-06 07:44:37 awq_marlin.py:89] The model is convertible to awq_marlin during runtime. Using awq_marlin kernel.
INFO 09-06 07:44:37 llm_engine.py:184] Initializing an LLM engine (v0.5.4) with config: model='team-hatakeyama-phase2/Tanuki-8x8B-dpo-v1.0-AWQ', speculative_config=None, tokenizer='team-hatakeyama-phase2/Tanuki-8x8B-dpo-v1.0-AWQ', skip_tokenizer_init=False, tokenizer_mode=auto, revision=None, rope_scaling=None, rope_theta=None, tokenizer_revision=None, trust_remote_code=True, dtype=torch.float16, max_seq_len=4096, download_dir=None, load_format=LoadFormat.AUTO, tensor_parallel_size=1, pipeline_parallel_size=1, disable_custom_all_reduce=False, quantization=awq_marlin, enforce_eager=False, kv_cache_dtype=auto, quantization_param_path=None, device_config=cuda, decoding_config=DecodingConfig(guided_decoding_backend='outlines'), observability_config=ObservabilityConfig(otlp_traces_endpoint=None, collect_model_forward_time=False, collect_model_execute_time=False), seed=0, served_model_name=team-hatakeyama-phase2/Tanuki-8x8B-dpo-v1.0-AWQ, use_v2_block_manager=False, enable_prefix_caching=False)
INFO 09-06 07:44:37 model_runner.py:886] Starting to load model team-hatakeyama-phase2/Tanuki-8x8B-dpo-v1.0-AWQ...
INFO 09-06 07:44:38 weight_utils.py:231] Using model weights format ['*.safetensors']
Loading safetensors checkpoint shards:   0% Completed | 0/6 [00:00<?, ?it/s]
Loading safetensors checkpoint shards:  17% Completed | 1/6 [00:00<00:03,  1.50it/s]
Loading safetensors checkpoint shards:  33% Completed | 2/6 [00:01<00:02,  1.36it/s]
Loading safetensors checkpoint shards:  50% Completed | 3/6 [00:02<00:02,  1.39it/s]
Loading safetensors checkpoint shards:  67% Completed | 4/6 [00:02<00:01,  1.39it/s]
Loading safetensors checkpoint shards:  83% Completed | 5/6 [00:03<00:00,  1.94it/s]
Loading safetensors checkpoint shards: 100% Completed | 6/6 [00:03<00:00,  1.78it/s]
Loading safetensors checkpoint shards: 100% Completed | 6/6 [00:03<00:00,  1.63it/s]

INFO 09-06 07:44:43 model_runner.py:898] Loading model weights took 23.4735 GB
INFO 09-06 07:44:46 gpu_executor.py:103] # GPU blocks: 6800, # CPU blocks: 2048
INFO 09-06 07:44:48 model_runner.py:1193] Capturing the model for CUDA graphs. This may lead to unexpected consequences if the model is not static. To run the model in eager mode, set 'enforce_eager=True' or use '--enforce-eager' in the CLI.
INFO 09-06 07:44:48 model_runner.py:1197] CUDA graphs can take additional 1~3 GiB memory per GPU. If you are running out of memory, consider decreasing `gpu_memory_utilization` or enforcing eager mode. You can also reduce the `max_num_seqs` as needed to decrease memory usage.
INFO 09-06 07:45:02 model_runner.py:1394] Graph capturing finished in 14 secs.
inputs_text: <s>以下は、タスクを説明する指示です。要求を適切に満たす応答を書きなさい。

### 指示:
日本のおすすめの観光地を教えてください。

### 応答:

outputs_text: もちろんです。日本には多くの魅力的な観光地がありますが、いくつか特におすすめの場所をご紹介します。

1. 京都
    - 清水寺: 世界遺産にも登録されている歴史的な寺院で、美しい木造建築と庭園が見どころです。
    - 金閣寺(鹿苑寺): 黄金に輝く建物が池に映る景色は圧巻です。
    - 伏見稲荷大社: 「千本鳥居」と呼ばれる赤い鳥居のトンネルが有名です。

2. 東京
    - 浅草寺: 東京で最も古い寺院の一つで、雷門や仲見世通りも楽しめます。
    - 明治神宮: 広大な森に囲まれた神社で、静寂な雰囲気が魅力です。
    - お台場: 未来的な都市景観とエンターテインメント施設が集まっています。

3. 北海道
    - 札幌雪まつり: 冬に開催される大規模なイベントで、巨大な氷像や雪像が展示されます。
    - 富良野・美瑛: ラベンダー畑や四季折々の花々が美しい風景が広がります。
    - 小樽運河: ロマンチックな夜景と歴史ある倉庫街が魅力です。

4. 沖縄
    - 美ら海水族館: 世界最大級の水槽があり、ジンベエザメなどの海洋生物を間近で見ることができます。
    - 首里城: 琉球王国時代の歴史を感じられる壮大な城跡です。
    - 古宇利島: エメラルドグリーンの海に囲まれた小さな島で、ドライブやビーチ散策が楽しめます。

5. 奈良
    - 東大寺: 大仏殿に鎮座する巨大な大仏は必見です。
    - 春日大社: 世界遺産に登録されており、美しい社殿群が見事です。
    - 吉野山: 桜の名所として知られ、春には見事な桜並木が広がります。

これらの観光地はそれぞれ独自の魅力を持っており、訪れる価値があります。旅行の目的や季節に応じて、最適な場所を選んでみてください。
Elapsed time: 17.8904 sec.
prompt tokens = 54
output tokens = 511 (28.562876 [tps])
    total time = 17.890356 [s]                           
                        

自動でモデルデータがダウンロードされ、問いかけた質問にきちんと答えてくれましたね!

応用・チャット風の受け答えに

基本スクリプトだと、事前設定した質問に回答後に終了してしまいます。
CUI上の簡易なテストプログラムではありますが、少し改造して、テキスト入力に対して連続で回答できるようにします(今回のスクリプトでは、毎回初回質問の形となります)。 以下、に改造したものを記すので「vllm_chat.py」などで保存して、実行してみてください。


from time import time
from vllm import LLM, SamplingParams

#環境によっては、以下に書き換える必要あり
#from vllm.entrypoints.llm import LLM
#from vllm.sampling_params import SamplingParams

#モデル名 AWQ量子化版を利用
model_name = "team-hatakeyama-phase2/Tanuki-8x8B-dpo-v1.0-AWQ"
#model_name = "weblab-GENIAC/Tanuki-8x8B-dpo-v1.0"
#model_name = "team-hatakeyama-phase2/Tanuki-8x8B-dpo-v1.0-GPTQ-4bit"
#model_name = "team-hatakeyama-phase2/Tanuki-8x8B-dpo-v1.0-GPTQ-8bit"

#vllmの起動
#gpu_memory_utilizationの部分は、環境に合わせて調整(オーバーフロー発生時は割合を減らす)
vllm = LLM(model_name, trust_remote_code=True, tensor_parallel_size=1, gpu_memory_utilization=0.8)  # 1GPUの場合
#vllm = LLM(model_name, trust_remote_code=True, tensor_parallel_size=2)  # 2GPUを使う場合
tokenizer = vllm.get_tokenizer()

default_message = {"role": "system", "content": "以下は、タスクを説明する指示です。要求を適切に満たす応答を書きなさい。"}

#main loop ====================================================
while True:
    print("input?>", end="")
    key_input = input()

    tmp_mes = [default_message, {"role": "user", "content": key_input}]
    inputs_text = tokenizer.apply_chat_template(tmp_mes, tokenize=False, add_generation_prompt=True)
    print(f"inputs_text: {inputs_text}")

    sampling_params = SamplingParams(temperature=0.0, max_tokens=1024, seed=1, repetition_penalty=1.1)

    #実行
    start = time()
    outputs = vllm.generate(inputs_text, sampling_params=sampling_params, use_tqdm=False)
    end = time()

    #出力
    outputs_text = outputs[0].outputs[0].text
    print(f"outputs_text: {outputs_text}")
    print(f"Elapsed time: {(end - start):.4f} sec.")

    input_tokens = len(outputs[0].prompt_token_ids)
    output_tokens = len(outputs[0].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]")
    print()

#end of this program
                            

以下は、実行例です。


root@machine:/home/xxx/tanuki# python docker/vllm_chat.py

(中略)

input?>こんにちは
inputs_text: <>以下は、タスクを説明する指示です。要求を適切に満たす応答を書きなさい。

### 指示:
こんにちは

### 応答:

outputs_text: こんにちは!今日はどんなお手伝いが必要ですか?質問や相談があれば、どうぞお気軽にお知らせください。
Elapsed time: 1.0484 sec.
prompt tokens = 43
output tokens = 29 (27.660848 [tps])
    total time = 1.048413 [s]

input?>アメリカのおすすめの観光地を教えてください。
inputs_text: <>以下は、タスクを説明する指示です。要求を適切に満たす応答を書きなさい。

### 指示:
アメリカのおすすめの観光地を教えてください。

### 応答:

outputs_text: もちろんです。アメリカには多くの魅力的な観光地がありますが、いくつか特におすすめの場所をご紹介します。

1. ニューヨーク市 - アメリカの象徴とも言える都市で、タイムズスクエア、セントラルパーク、自由の女神像など見どころがたくさんあります。ブロードウェイのミュージカルも必見です。

2. グランドキャニオン国立公園 - アリゾナ州に位置し、その壮大な自然景観は圧巻です。ハイキングや写真撮影を楽しむのに最適な場所です。

3. ロサンゼルス - 映画産業の中心地でありながら、サンタモニカビーチやビバリーヒルズ、ディズニーランド・リゾートなど多彩な楽しみ方ができます。

4. サンフランシスコ - ゴールデンゲートブリッジやアルカトラズ島、フィッシャーマンズワーフなど、美しい風景と歴史的な名所が豊富です。また、ケーブルカーも見逃せません。

5. ワシントンD.C. - アメリカ合衆国の首都で、ホワイトハウス、国会議事堂、スミソニアン博物館群など、政治と文化の中心地として非常に興味深い場所です。

6. シアトル - スペースニードルやパイク・プレイスマーケット、スターバックス1号店など、ユニークな観光スポットが多くあります。また、アウトドア活動が好きな方にはマウントレーニア国立公園もおすすめです。

7. ニューオーリンズ - ジャズ音楽とフレンチクォーターの活気ある雰囲気が楽しめる街です。マルディグラ祭りも有名です。

8. シカゴ - 高層ビル群が立ち並ぶ「風の街」として知られ、ウィリス・タワーからの眺めは一見の価値ありです。また、ミレニアムパークやネイビーピアも訪れる価値があります。

これらの場所はそれぞれ独自の魅力を持っており、訪れる人々にとって忘れられない体験を提供してくれるでしょう。旅行の目的や興味に合わせて選んでみてくださいね。
Elapsed time: 13.8894 sec.
prompt tokens = 54
output tokens = 396 (28.510975 [tps])
    total time = 13.889388 [s]

input?>
       

チャットのように連続応答できていますね(終了時はCtrl-Cで終了してください)。
ローカル実行で、GPUメモリ上に学習済モデルが展開されてからのループとなるため非常にレスポンスも早いです。

GATサーバーでの速度

ネクスティ エレクトロニクスでは、各種GPUサーバーの自由度の高い試行のできる、 GPU Advenced Test Drive(GAT) サービスを展開しています。 こういったローカルLLMのようなアプリケーションをオンプレミスで導入する前の、事前テストなどにご利用頂けます。

今回、GATサービスで展開中の各種サーバーにて、今回のTanuki-8x8B(AWQ量子化版)を動かしてみました。 基本スクリプトを実行し、そのTPS(1秒あたりのトークン数)を一覧表にしました。

サーバー名 並列GPU数 TPS(Token per second)
DGX-H100 8 140.1555
DGX-H100 4 105.6157
DGX-H100 2 69.62028
DGX-H100 1 42.23749
DGX-A100 1 29.92136
GSV(RTX6000Ada+A800) 2 48.57265
GSV(RTX6000Ada+A800) 1 28.22094

TPSの数値が多いほど高速です。一番高速なDGX-H100の8並列時は「1秒140トークン」という高速実行で、 先程の日本のおすすめ観光地については、わずか3.6秒程度であれだけの文字数をマシンガントークで返答してくれます。

おわりに

今回は、純国産のローカル向けLLMである、「Tanuki-8x8B」を実際に動かして。その方法とスクリプトの実行について解説しました。 実際に手元で動かしてみると、より理解が深まったり、細かい所が見えてきたりするものです。 また、この精度・速度で動くとなると、さまざまな応用展開なども考えられるかと思います。

ネクスティ エレクトロニクス開発部では、先端の技術動向を調査し、PCやGPUサーバー・NVIDIA DRIVE Orin等のエッジで実際に試してみる事例を数多く行っています。

また、ネクスティ エレクトロニクスでは、こういったAIに関する技術サポートや、 学習や実行のためのDGX-H100/A100などのサーバートライアル環境サービス(GPU Advenced Test Drive:GAT)も行っています。 お気軽にお問い合わせください。