ConoHa WINGで AI 動かすお

この記事は [ConoHa Advent Calendar 2024](https://qiita.com/advent-calendar/2024/conoha) 16日目の記事です。

## ワシは ConoHa WING で AI を動かしたいんじゃ
なぜかって？そこに愛(AI)があるから。

ConoHa WING は[共用WEBホスティングサービス](https://qiita.com/horiken1216/items/183547610badcb9f4938)で、rootも使えないしGPUも使えないのでAIを動かす環境としてなんのメリットもありませんが、Linuxでコンソール使えるんだから超軽量モデルなら推論ぐらいいけんだろ、という淡い期待と知的好奇心を胸に抱いて進めていきます。


## 環境構築
動作環境として [ollama](https://ollama.com/) をインストロールしていきます。
バイナリ配布で共有ライブラリを必要としないため、普通にConoHa WINGで動きます。
公式が配布しているインストールスクリプトは root 前提なので、GPU関係をカットして、一般ユーザーで `$HOME` にインストールするようAIに頼んで改変しています、
<details><summary>mod_ollama-install.sh </summary>

```
#!/bin/bash
# Ollama Installer for Linux (General User, CPU-only)

set -eu

# Utility functions
status() { echo ">>> $*" >&2; }
error() { echo "ERROR: $*"; exit 1; }
warning() { echo "WARNING: $*"; }

# Temporary directory for downloads
TEMP_DIR=$(mktemp -d)
cleanup() { rm -rf "$TEMP_DIR"; }
trap cleanup EXIT

# Verify necessary tools are available
require_tools() {
    local MISSING=''
    for TOOL in curl awk grep sed tar; do
        if ! command -v "$TOOL" >/dev/null; then
            MISSING="$MISSING $TOOL"
        fi
    done

    if [ -n "$MISSING" ]; then
        error "Missing required tools: $MISSING. Please install them and try again."
    fi
}
require_tools

# Determine architecture
ARCH=$(uname -m)
case "$ARCH" in
    x86_64) ARCH="amd64" ;;
    aarch64|arm64) ARCH="arm64" ;;
    *) error "Unsupported architecture: $ARCH" ;;
esac

# Installation directories
INSTALL_DIR="$HOME/ollama"
BINDIR="$HOME/.local/bin"

# Create necessary directories
mkdir -p "$INSTALL_DIR" "$BINDIR"

# Download and extract Ollama
status "Downloading Ollama for Linux ($ARCH)..."
curl --fail --show-error --location --progress-bar \
    "https://ollama.com/download/ollama-linux-${ARCH}.tgz" | \
    tar -xzf - -C "$INSTALL_DIR"

# Create a symlink to the executable in the user's PATH
if [ "$INSTALL_DIR/ollama" != "$BINDIR/ollama" ]; then
    status "Linking Ollama to $BINDIR"
    ln -sf "$INSTALL_DIR/ollama" "$BINDIR/ollama"
fi

# Add $HOME/.local/bin to PATH if not already included
if ! echo "$PATH" | grep -q "$HOME/.local/bin"; then
    status "Adding $HOME/.local/bin to PATH (temporarily)"
    export PATH="$HOME/.local/bin:$PATH"
    warning "To make this permanent, add 'export PATH=\$HOME/.local/bin:\$PATH' to your shell configuration file (e.g., ~/.bashrc or ~/.zshrc)."
fi

# Finish installation
status "Ollama installation complete!"
status "Run 'ollama' to start using it."
```
</details>

```
$ sh mod_ollama-install.sh
>>> Downloading Ollama for Linux (amd64)... 
######################################################################## 100.0% 
>>> Linking Ollama to /home/xxxxxxxx/.local/bin
>>> Ollama installation complete!
>>> Run 'ollama' to start using it.
```
まるで問題なくインストールできました。

## 実行
モデルをロードして実行していきます。今回はMicrosoftが開発し公開している [phi-3-mini](https://azure.microsoft.com/ja-jp/products/phi) を使用します。これは `3.8B` のパラメータを持つ小型の言語モデル(SML: Small Language Model)で、Azure AI Studio や Hugging Face でも利用可能ですが、今回はローカルで実行すること自体が目的なので ollama で実行していきます。
```
$ ollama/bin/ollama serve 
Couldn't find '/home/xxxxxxxx/.ollama/id_ed25519'. Generating new private key. 
Your new public key is:  

ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKdZ8YOn0ZpNDYWTfcOB1a4hnLlKdiXuOj+9F8fh4hiL

2024/12/03 21:42:37 routes.go:1197: INFO server config env="map[CUDA_VISIBLE_DEVICES: GPU_DEVICE_ORDINAL: HIP_VISIBLE_DEVICES: HSA_OVERRIDE_GFX_VERSION: HTTPS_PROXY: HTTP_PROXY: NO_PROXY: OLLAMA_DEBUG:false OLLAMA_FLASH_ATTENTION:false OLLAMA_GPU_OVERHEAD:0 OLLAMA_HOST:http://127.0.0.1:11434 OLLAMA_INTEL_GPU:false OLLAMA_KEEP_ALIVE:5m0s OLLAMA_LLM_LIBRARY: OLLAMA_LOAD_TIMEOUT:5m0s OLLAMA_MAX_LOADED_MODELS:0 OLLAMA_MAX_QUEUE:512 OLLAMA_MODELS:/home/r6210970/.ollama/models OLLAMA_MULTIUSER_CACHE:false OLLAMA_NOHISTORY:false OLLAMA_NOPRUNE:false OLLAMA_NUM_PARALLEL:0 OLLAMA_ORIGINS:[http://localhost https://localhost http://localhost:* https://localhost:* http://127.0.0.1 https://127.0.0.1 http://127.0.0.1:* https://127.0.0.1:* http://0.0.0.0 https://0.0.0.0 http://0.0.0.0:* https://0.0.0.0:* app://* file://* tauri://* vscode-webview://*] OLLAMA_SCHED_SPREAD:false OLLAMA_TMPDIR: ROCR_VISIBLE_DEVICES: http_proxy: https_proxy: no_proxy:]"
time=2024-12-03T21:42:37.997+09:00 level=INFO source=images.go:753 msg="total blobs: 0"
time=2024-12-03T21:42:37.997+09:00 level=INFO source=images.go:760 msg="total unused blobs removed: 0"
time=2024-12-03T21:42:37.997+09:00 level=INFO source=routes.go:1248 msg="Listening on 127.0.0.1:11434 (version 0.4.7)"
time=2024-12-03T21:42:37.998+09:00 level=INFO source=common.go:135 msg="extracting embedded files" dir=/home/xxxxxxxx/tmp/ollama2882729364/runners
time=2024-12-03T21:42:38.063+09:00 level=INFO source=common.go:49 msg="Dynamic LLM libraries" runners="[cuda_v12 rocm cpu cpu_avx cpu_avx2 cuda_v11]" 
time=2024-12-03T21:42:38.063+09:00 level=INFO source=gpu.go:221 msg="looking for compatible GPUs"
time=2024-12-03T21:42:38.081+09:00 level=INFO source=gpu.go:386 msg="no compatible GPUs were discovered" 
time=2024-12-03T21:42:38.081+09:00 level=INFO source=types.go:123 msg="inference compute" id=0 library=cpu variant=avx2 compute="" driver=0.0 name="" total="377.2 GiB" available="220.5 GiB"
```
ollama がサービスとして立ち上がりました。※ConoHa WINGはユーザーによるサービスの起動をサポートしていないので、長時間稼働させたり高負荷を掛けるとkillされる場合があります。


モデルをロードして実行してみます。初回はモデルのダウンロードがあります。
```
$ ollama/bin/ollama run phi3 
pulling manifest
pulling 633fc5be925f... 100% ▕████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ 2.2 GB
pulling fa8235e5b48f... 100% ▕████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ 1.1 KB
pulling 542b217f179c... 100% ▕████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏  148 B
pulling 8dde1baf1db0... 100% ▕████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏   78 B
pulling 23291dc44752... 100% ▕████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏  483 B
verifying sha256 digest
writing manifest
success
>>> 今日の天気は？ 
今日の湿気 は高く、多くの人々が外出を控えることをおすすめします。雨予報では明日午後から台風による一時的な降水が見込まれています。 

>>>
>>> 今日も渋谷で5時？ 
今日の渋谷では、まだ5時になりません。標準時間によると現在は6時45分です。渋谷は東京都であるため、一般的な標準時間が適用されています。しかし、夏期には日本時間が適用されることがあり、その場合は現在は6時45分でなく、10時45分（12時Error: an error was encountered while running the model: unexpected EOF
```
動きました。日本語の質問には日本語で答えてくれます。一応。。。
何かエラーが起こってますね。

```
$ top -c
top - 22:00:30 up 362 days,  8:47,  3 users,  load average: 2.76, 2.67, 2.94
Tasks:   9 total,   1 running,   8 sleeping,   0 stopped,   0 zombie
%Cpu(s): 11.0 us,  4.5 sy,  0.0 ni, 84.2 id,  0.0 wa,  0.1 hi,  0.1 si,  0.0 st
KiB Mem : 39557494+total, 20642198+free, 15441641+used, 34736532 buff/cache
KiB Swap:  4194300 total,  4177404 free,    16896 used. 22362560+avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                                                                                                                                 
45399 xxxxxxxx  20   0 7668704   5.1g   6964 S 601.7  1.4   4:31.15 /home/xxxxxxxx/tmp/ollama1153868121/runners/cpu_avx2/ollama_llama_server --model /home/xxxxxxxx/.ollama/models/blobs/sha256-633fc5be925f9a484b61d6f9b9a78021eeb462100bd557309f01ba84cac26adf --ctx-siz+ 
48895 xxxxxxxx  20   0 2929676  53416  34000 S   0.3  0.0   0:07.71 ollama/bin/ollama serve
49161 xxxxxxxx  20   0  162012   4484   3868 R   0.3  0.0   0:00.21 top -c                                                                                                                                                                                                  
54850 xxxxxxxx  20   0 2016464  18796  11520 S   0.3  0.0   0:00.20 ollama/bin/ollama run phi3
 8338 xxxxxxxx  20   0  116528   4372   3176 S   0.0  0.0   0:00.01 -bash
32353 xxxxxxxx  20   0  116528   4448   3236 S   0.0  0.0   0:00.04 -bash
40969 xxxxxxxx  20   0  116528   4448   3304 S   0.0  0.0   0:00.00 -bash
```
はい。CPU使用率が割り当て最大の `600%(6vCPU相当)` に到達しています。ダミダこりゃ。でもメモリは意外と使ってませんね。なお、
```
$ ollama/bin/ollama run phi3 
>>> 石破茂という政治家について説明して

石破茂（Ishi Matsu）は、日本の政治家であり、2012年5月16日に党内での首相選手となった。背景には、経済学者としても知られることがあり、国土交通省や「石破」という運用事業で尊敬を集めていた。若くして高い立場に就き初めており、その迅速な進出が注目されることから、政治の世界におけるError: an error was encountered while running the model: GGML_ASSERT(rc == 0) failed
```
回答の精度はまあこんなもんです。ある程度日本語として成立する文章を吐いていますが、知識の網羅性や内容の正確性でLLMと比較してはいけません。

このモデルはサイズを抑えるために英語中心の厳選された少量のデータで訓練されており、英語では GPT-3.5-Turbo にも匹敵する精度が出るとされていますが、日本語や日本ローカルの情報では能力を今一つ発揮できないということもあるようです。

## というわけで
とりあえず ConoHa WING で AI 動かしてみたよというお話でした。
(負荷要因になる可能性があるのであまりお勧めするものではありません。)

それでは皆様よいホリデーシーズンをお迎えください。