4
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Intel環境でLLMを動かす(NPU編)

Last updated at Posted at 2024-12-16

はじめに

 IntelでLLMを動かす際の手順についてまとめました。なお、GPU環境との同時起動は考慮されていません。

使用環境

  • AtomMan X7 Ti 185H
  • CPU: Intel Core Ultra9 processor 185H
  • NPU: Intel AI Boost
  • Memory: 96GB
  • OS: Ubuntu 24.04.1 LTS

手順

ドライバをインストールする

 まず、Intelのサイトを参考にドライバをインストールします。

 古いドライバを削除します。

sudo dpkg --purge --force-remove-reinstreq intel-driver-compiler-npu intel-fw-npu intel-level-zero-npu

(GPU環境でこれを実行すると、Level-Zeroドライバが削除されて、にっちもさっちもいかなくなります。)

 新しいドライバをダウンロードしてきます。

wget https://github.com/intel/linux-npu-driver/releases/download/v1.10.0/intel-driver-compiler-npu_1.10.0.20241107-11729849322_ubuntu24.04_amd64.deb
wget https://github.com/intel/linux-npu-driver/releases/download/v1.10.0/intel-fw-npu_1.10.0.20241107-11729849322_ubuntu24.04_amd64.deb
wget https://github.com/intel/linux-npu-driver/releases/download/v1.10.0/intel-level-zero-npu_1.10.0.20241107-11729849322_ubuntu24.04_amd64.deb

 ドライバを放置したまま、libtbb12をインストールします。放置する理由はよくわかりません。

sudo apt update
sudo apt install libtbb12

 放置していたドライバをインストールします。

sudo dpkg -i *.deb

 Level-Zeroドライバをダウンロードして、インストールします。

wget https://github.com/oneapi-src/level-zero/releases/download/v1.17.44/level-zero_1.17.44+u22.04_amd64.deb
sudo dpkg -i level-zero*.deb

 インストールされたかどうか確認します。

dpkg -l level-zero

 このように出ればOK。

要望=(U)不明/(I)インストール/(R)削除/(P)完全削除/(H)保持
| 状態=(N)無/(I)インストール済/(C)設定/(U)展開/(F)設定失敗/(H)半インストール/(W>
|/ エラー?=(空欄)無/(R)要再インストール (状態,エラーの大文字=異常)
||/ 名前           バージョン   アーキテクチ 説明
+++-==============-============-============-=================================
ii  level-zero     1.17.44      amd64        oneAPI Level Zero

 ここで再起動します。

 再起動して、ls /dev/accel/accel0が通ればOKです。

 デバイスをroot以外のユーザでも使えるように、以下の設定を施します。

sudo usermod -a -G render <ユーザ名> #<ユーザ名>は適宜置換え 
sudo bash -c "echo 'SUBSYSTEM==\"accel\", KERNEL==\"accel*\", GROUP=\"render\", MODE=\"0660\"' > /etc/udev/rules.d/10-intel-vpu.rules"
sudo udevadm control --reload-rules
sudo udevadm trigger --subsystem-match=accel
reboot

NPU用ライブラリをインストールする。

 まず、cmakeをインストールしておきます。

sudo apt install cmake

 ここで、間違えてもpip install cmakeを実行してはいけません。ここ、結構ハマりました。

 以下は例によって、必要であれば仮想環境下で操作します。

pip install intel-npu-acceleration-library

 同時にPytorchやTransformersもインストールされるようです。その他にも、matplotlibとかnumpyとかpandasとか、定番のライブラリを拾ってくれるので、一から入れる場合はお得感で少し幸せになれるかもしれません。

 これで準備は完了です。

LLMを使ってみる

 今回もtanuki8Bを試してみます。前回のファイルを少し改変します。また、float32で処理できないようなので、float16で処理します(bfloat16もだめな模様)。

tanuki_NPU.py
import datetime
from intel_npu_acceleration_library import NPUModelForCausalLM, float16
from intel_npu_acceleration_library.compiler import CompilerConfig
from transformers import AutoTokenizer, TextStreamer
import torch

st = datetime.datetime.now()
print("開始時刻", end=": ")
print(st)

compiler_conf = CompilerConfig(dtype=float16)
model = NPUModelForCausalLM.from_pretrained("weblab-GENIAC/Tanuki-8B-dpo-v1.0", use_cache=True, config=compiler_conf).eval()
tokenizer = AutoTokenizer.from_pretrained("weblab-GENIAC/Tanuki-8B-dpo-v1.0")
streamer = TextStreamer(tokenizer, skip_prompt=True, skip_special_tokens=True)

messages = [
   {"role": "system", "content": "以下は、タスクを説明する指示です。要求を適切に満たす応答を書きなさい。"},
   {"role": "user", "content": "たぬきに純粋理性批判は理解できますか?"}
]

input_ids = tokenizer.apply_chat_template(messages, add_generation_prompt=True, return_tensors="pt").to(model.device)
output_ids = model.generate(input_ids,
                           max_new_tokens=1024,
                           temperature=0.5,
                           streamer=streamer)

et = datetime.datetime.now()
print("終了時刻", end=": ")
print(et)

t = et - st
print("所要時間", end=": ")
print(t)

 だいたいこのくらいの時間になりました。

所要時間: 0:06:10.993427

 GPUより若干遅めです。int4にすると少しだけ速くなりました。

4
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?