Linux（Debian）と GeForce RTX 3050 でローカル LLM の構築

## はじめに

自宅の空いているPCに、使用していない GeForce RTX 3050 を組み込んで、ローカル LLM を構築しました。

参考にしたウェブページ

https://qiita.com/hiromy141/items/b77876333758183cb16c

## 開発環境

何も問題が起きないので、Windows の WSL2 などを使用せずに、空いているPCに直接 Linux をインストールします。いつも使用している Xubuntu が、llama-cpp-python のビルドでエラーが出て回避方法が難しいので、今回は Debian（Xfce版）を使用しました。Debian は Ubuntu のベースOSなので、操作がほとんど同じです。

デスクトップ自作PC（GIGABYTE B550 マザーボード）
AMD Ryzen 5 5600G　6コア 12スレッド 3.9GHz
メモリ DDR4-3200 16GB x 2
SSD 1TB
GeForce RTX 3050 （他のPCで 4080 SUPER に置き換えたので未使用でした）

## Debian インストール

debian-live-12.9.0-amd64-xfce.iso

[Rufus](https://rufus.ie/en/) を使って起動 USB メモリを作成
PCの電源を入れて DEL キーを押して USB から立ち上げる
デスクトップに表示される Install Debian アイコンをダブルクリックして、PCへのインストールを開始

Language: English
Location: Asia、Tokyo
Keyboard: Japanese
Your name: webmaster
Your computer's name: bookworm01
Your username: webmaster
Password: ******
Confirm password: ******
ネットワークは有線で接続

インストールが終わったら、USB メモリを外して起動

　
OS アップデート
sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade
再起動

　
SSH インストール
sudo apt update
sudo apt install openssh-server

外部から SSH で接続
ssh -l webmaster 192.168.1.27
password: ******

　
日本語入力
日本語入力をセットアップしますが、画面は英語のままにしています
Debian でモジュールが1個欠けている模様
参考
https://fridaynight-hilite-club.hatenablog.com/entry/2025/01/11/193821
sudo apt update
sudo apt install mozc-server mozc-utils-gui fcitx5-mozc ibus-mozc
再起動
im-config で「ibus」が選択されていることを確認
ibus-setup の［入力メソッド］で「日本語 － Mozc」を選択
入力切替えを、＜Super＞space から ＜Control＞space に変更、Apply ボタン
バー右上、左クリックで Input Mode を Direct input から Hiragana に変更

　
固定IP
sudo nano /etc/network/interfaces
```text:/etc/network/interfaces
source /etc/network/interfaces.d/*
auto lo
iface lo inet loopback
allow-hotplug enp5s0

#iface enp5s0 inet dhcp
iface enp5s0 inet static

address 192.168.1.11
network 192.168.1.0
netmask 255.255.255.0
broadcast 192.168.1.255
gateway 192.168.1.1
dns-nameservers 123.456.123.456,777.888.999.000
```
再起動

　
VNCサーバー
sudo apt update
sudo apt-get install x11vnc
sudo x11vnc -storepasswd /etc/.vncpasswd
sudo x11vnc -auth guess -display :0 -rfbauth /etc/.vncpasswd -rfbport 5900 -forever -loop -noxdamage -repeat -shared
Ctrl+C で停止
sudo nano /etc/systemd/system/x11vnc.service
```
[Unit]
Description=x11vnc (Remote access)
After=network-online.target

[Service]
Type=simple
ExecStart=/usr/bin/x11vnc -auth guess -display :0 -rfbauth /etc/.vncpasswd -rfbport 5900 -forever -loop -noxdamage -repeat -shared
ExecStop=/bin/kill -TERM $MAINPID
ExecReload=/bin/kill -HUP $MAINPID
KillMode=control-group
Restart=on-failure

[Install]
WantedBy=graphical.target
```
sudo systemctl daemon-reload
sudo systemctl enable x11vnc
sudo systemctl start x11vnc
クライアントは VNC Viewer を使用しています

　
よく使うコマンド
pwd
ls -alF
ip addr show
nano .env　（矢印キーでカーソル移動、保存Ctrl+S、終了Ctrl+X）
Ctrl+Alt+[F6] でGUIを抜けてコンソール画面に行く
sudo shutdown -h now
sudo reboot

　

## CUDA Toolkit インストール

[https://developer.nvidia.com/cuda-toolkit](https://developer.nvidia.com/cuda-toolkit)
　

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956789/096b05bd-18f4-4ea0-8d68-ef86cd4f79ad.png" width=80%>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956789/99a67714-49af-46bf-9c09-c7e088c7740d.png" width=80%>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956789/3b2c9a90-2271-42ce-9bb3-7ff42f666efa.png" width=80%>


#### 事前準備
sudo apt update
sudo apt install wget

#### インストール

Linux、x86_64、Debian、12、deb (local) で表示された手順に従って実施します。

```console
wget https://developer.download.nvidia.com/compute/cuda/12.8.0/local_installers/cuda-repo-debian12-12-8-local_12.8.0-570.86.10-1_amd64.deb
sudo dpkg -i cuda-repo-debian12-12-8-local_12.8.0-570.86.10-1_amd64.deb
sudo cp /var/cuda-repo-debian12-12-8-local/cuda-*-keyring.gpg /usr/share/keyrings/
sudo apt-get update
sudo apt-get -y install cuda-toolkit-12-8
```

```console
sudo apt-get install -y nvidia-open
```

再起動

nano ~/.bashrc

```console:~/.bashrc
export PATH="/usr/local/cuda/bin:$PATH"
export LD_LIBRARY_PATH="/usr/local/cuda/lib64:$LD_LIBRARY_PATH"
```

source ~/.bashrc

nano ~/.profile
```text:~/.profile
#!/bin/bash
if [[ -f ~/.bashrc ]] ; then
    .  ~/.bashrc
fi
```

nvcc -V

```console:nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2025 NVIDIA Corporation
Built on Wed_Jan_15_19:20:09_PST_2025
Cuda compilation tools, release 12.8, V12.8.61
Build cuda_12.8.r12.8/compiler.35404655_0
```

　

## cuDNN インストール

[https:///developer.nvidia.com/cudnn](https:///developer.nvidia.com/cudnn)
　

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956789/4d70f558-ebff-4c6d-bee2-752cf1682cb4.png" width=80%>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956789/7a92627e-dc03-42e9-a681-22ded8254b59.png" width=80%>


```console
wget https://developer.download.nvidia.com/compute/cudnn/9.7.1/local_installers/cudnn-local-repo-debian12-9.7.1_1.0-1_amd64.deb
sudo dpkg -i cudnn-local-repo-debian12-9.7.1_1.0-1_amd64.deb
xx sudo cp /var/cuda-repo-debian12-9-7-local/cudnn-*-keyring.gpg /usr/share/keyrings/
sudo apt-get update
sudo apt-get -y install cudnn
```

3行目は、2行目を実施した際に表示されたメッセージに従って、以下のコマンドを実行しました
sudo cp /var/cudnn-local-repo-debian12-9.7.1/cudnn-local-A654D8F2-keyring.gpg /usr/share/keyrings/

再起動

※ cudnn-cuda-11、cudnn-cuda-12 はインストールしない

　
スクリーンセーバーがブランク状態から復帰しなくなったので、以下のウェブページを参考に設定を行いました。すべての nvidia のサービスを enable にしました
また、Settings > Power Manager の Display タブで、Display power management を OFF、Blank after を Never、Put to sleep after を Never、Switch off after を Never にします（利用が終わったら手動でユーザーをログアウトする）

https://note.com/sylphid_modder/n/nfa5612a989a8

sudo systemctl list-unit-files --type=service
sudo systemctl enable nvidia-hibernate.service nvidia-resume.service nvidia-suspend.service
sudo systemctl enable nvidia-powerd.service nvidia-suspend-then-hibernate.service
再起動



　

## llama-cpp-python のビルド

#### 事前準備

python3 --version
sudo apt install python3.11-venv
sudo apt-get install -y git


#### ビルド

```console
webmaster@debian01:~$ python3 -m venv .llm
webmaster@debian01:~$ source .llm/bin/activate
(.llm) webmaster@debian01:~$
```
<font color="red">※参照元の「source ./llm/bin/activate」は誤り（./lin でなく .llm）</font>
非活性化は deactivate


```console
(.llm) webmaster@deian01:~$ CMAKE_ARGS="-DGGML_CUDA=on -DCMAKE_CUDA_COMPILER=/usr/local/cuda-12.8/bin/nvcc" FORCE_CMAKE=1 pip install llama-cpp-python --force-reinstall --no-cache-dir
```

ARGS に以下を追記しています
-DCMAKE_CUDA_COMPILER=/usr/local/cuda-12.8/bin/nvcc

llama-cpp-python　のマニュアルはこちら
[https://github.com/abetlen/llama-cpp-python](https://github.com/abetlen/llama-cpp-python)

　

## LLM モデルファイルをダウンロード

[https://huggingface.co/elyza/Llama-3-ELYZA-JP-8B-GGUF](https://huggingface.co/elyza/Llama-3-ELYZA-JP-8B-GGUF)

［File and virsions］タブ
[https://huggingface.co/elyza/Llama-3-ELYZA-JP-8B-GGUF/tree/main](https://huggingface.co/elyza/Llama-3-ELYZA-JP-8B-GGUF/tree/main)
　
後者のページの Llama-3-ELYZA-JP-8B-q4_k_m.gguf ファイルの Download file ボタンを押下します
ダウンロードしたファイルを、自分のホームディレクトリに置きました

　

## Python で LLM を実行

```Python:sample.py
from llama_cpp import Llama

llm = Llama(
    model_path="Llama-3-ELYZA-JP-8B-q4_k_m.gguf",
    n_gpu_layers=10    #GPUを使う指定をする
)

prompt = """
システム: あなたは日本の文化の専門家です。日本語で回答してください。
ユーザー: 男性の着物は右側と左側でどちらが前ですか？
アシスタント: """

output = llm(
    prompt=prompt,
    stop=["ユーザー:", "アシスタント:", "\n"],    #返信にこの単語があれば終了
    echo=True,
    max_tokens=50,    # 生成する最大トークン数を指定
)

print(output["choices"][0]["text"])

```

```console
(.llm) webmaster@deian01:~$ python sample.py

システム: あなたは日本の文化の専門家です。日本語で回答してください。
ユーザー: 男性の着物は右側と左側でどちらが前ですか？
アシスタント: すみませんが、男性の着物は左前が基本です。左の肩が前になります。

```

max_tokens を指定しないと、短い文章または途中までしか返しません

　

## Dify との接続

#### Ollama を使用

Dify と接続するために Ollama を使用します

[https://ollama.com/](https://ollama.com/)

　
ダウンロードとインストール
```console
sudo curl -fsSL https://ollama.com/install.sh | sh
```

　
マニュアル
[https://github.com/ollama/ollama/blob/main/README.md#quickstart](https://github.com/ollama/ollama/blob/main/README.md#quickstart)

　
Ollama でローカルLLMを使用する際の設定方法

１．Modelfile という名前のファイルを作成し、モデルファイルを指定する
nano Modelfile
```text:Modelfile
FROM ./Llama-3-ELYZA-JP-8B-q4_k_m.gguf
```

２．モデルを作成する
ollama create ELYZA-JP-8B -f Modelfile

３．モデルを実行する
ollama run ELYZA-JP-8B
Ctrl+D または /bye で停止

４．その他
ollama -v
ollama list
ollama ps
ollama rm example
http://<foo>localhost</foo>:11434

５．外部PCからの接続を許可する
sudo systemctl status ollama
sudo systemctl edit ollama.service
　　「### Anything」と「### Lines」のコメントの間に以下を記述する
sudo systemctl restart ollama.service

```text:systemctl edit ollama.service
# add [OLLAMA_HOST] variable
# to listen all, specify [0.0.0.0]
# to listen internal network, specify internal IP address
[Service]
Environment="OLLAMA_HOST=0.0.0.0"
```

以下で変更を確認
sudo nano /etc/systemd/system/ollama.service.d/override.conf

他のPCから Ollama のページを表示できる

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956789/9ac38625-3fe7-4627-ac5e-ad12113a8282.png" width=50%>

　

#### Dify の設定

Dify は下記のページで、他のPCに構築済みです。

「Ubuntu、Docker Desktop で Dify を作成」
[https://qiita.com/sato_7411/items/8c2bd2333b7660c65125](https://qiita.com/sato_7411/items/8c2bd2333b7660c65125)

右上［ユーザー名］－［設定］－［モデルプロバイダー］に Ollama を追加します

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956789/2da969cd-18fc-4ad7-86e5-2d46af90cba2.png" width=80%>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956789/1d36f75c-8921-4847-a9ad-aad86ae0c1c2.png" width=80%>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956789/5075b221-c0ad-4a27-a27b-15b4f45527b4.png" width=80%>

　

スタジオ
アプリを作成する
最初から作成
チャットボット
名前「ローカルLLM」
作成する

上記の「設定」との間を何度か行き来しないと、モデル一覧に「ELYZA-JP-8B」が現れない感じでした

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956789/1fae66b4-3d07-4725-89d8-29df660f3a9b.png" width=80%>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956789/cfdd9c80-d770-4479-8b9d-fede50f0f206.png" width=80%>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956789/37c53107-326c-43c6-8d6b-638db1f50c7e.png" width=80%>


以上です。