ラベル LLM の投稿を表示しています。 すべての投稿を表示
ラベル LLM の投稿を表示しています。 すべての投稿を表示

2026/06/08

Claude CodeをローカルLLMで動かす

4ヶ月前のOpenHands実験から時間も経ったので、コーティングエージェントで使えるローカルLLMでそれなりに使えるものがないかなと探してみたところ、 今日の時点ではQwen3.6-27Bが良いらしいということわかったので、試してみました。

利用するのは

  • llama.cpp
  • Claude Code
の2つです。

llama.cppの準備


https://github.com/ggml-org/llama.cpp からコードを取得します。今回は rev. f71af352a52b8efe824c7a698d0632afa4794c01 を使いました。cloneしたときの最新版です。

今回は https://github.com/ggml-org/llama.cpp/blob/master/docs/build.md を読んで、GPU対応のllama.cppをビルドしました。

ビルド環境にCUDA関連のツールが必要なので、NVidiaの「CUDA Toolkit 13.3 Downloads」ページから「deb (network)」を選んで、記載されている方法でインストールしました。

OpenBLASもUbuntu24.04の標準パッケージをインストールした上で、以下のコマンドでビルドしました。

cmake -B build -DGGML_BLAS=ON -DGGML_BLAS_VENDOR=OpenBLAS -DGGML_CUDA=ON  -DCMAKE_CUDA_COMPILER=/usr/local/cuda/bin/nvcc -DCMAKE_CUDA_ARCHITECTURES="120" -DCUDAToolkit_ROOT=usr/local/cuda
cmake --build build --config Release -j 8
その後、実行すればLLMの準備は完了です。
export LLAMA_CACHE="model-cache/unsloth/Qwen3.6-27B-MTP-GGUF"
build/bin/llama-server \
    -hf unsloth/Qwen3.6-27B-MTP-GGUF:UD-Q2_K_XL \
    -ngl 99 --fit on -c 65536 -fa on -np 1 \
    --spec-type draft-mtp --spec-draft-n-max 2 \
    --host 0.0.0.0 \
    --cache-type-k q4_0 \
    --cache-type-v q4_0
GPUのメモリは16GBあるのですが、Q2にして、かつ、cache-typeをq4_0にしないと、コンテキスト長を65536まで伸ばせませんでした。131072だとメモリ不足で落ちます。 98304でもギリギリ動くようです。

Claude Codeの準備


Claude CodeはDockerコンテナ内で動かします。
FROM ubuntu:24.04
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y \
    curl \
    ca-certificates \
    gnupg \
    nodejs \
    npm \
    && rm -rf /var/lib/apt/lists/*
WORKDIR /workspace
RUN npm install -g @anthropic-ai/claude-code
ビルドは
docker build -f Dockerfile -t claude-code .
で行い、起動は
touch .bash_history # 不要かも?
docker run -it --rm \
  --name claude-code \
  -v "$(pwd)/workspace:/workspace" \
  -v "$(pwd)/.claude-home:/root/.claude" \
  -v "$(pwd)/.bash_history:/root/.bash_history" \
  -e ANTHROPIC_API_KEY=llamacpp \
  -e ANTHROPIC_AUTH_TOKEN=llamacpp \
  -e ANTHROPIC_BASE_URL=http://xxx.xxx.xxx.xxx:8080 \
  -e ANTHROPIC_MODEL=qwen3.6-27b \
  -w /workspace \
  --gpus all \
  claude-code
で行います。ANTHROPIC_BASE_URLの部分は実行環境のホストのIPアドレスを指定します。たぶん 127.0.0.1では動きません。

Dockerコンテナ内に入るので、そこで、claudeとタイプすればあとは普通に使えます。

ただし、Claude CodeがWebサーチできないので、なにか設定が抜けているかもしれません。

実験したときのClaude Codeはv2.1.168でした。

使ってみると?


思ってたより普通に動きます。難しいことはできないかもしれませんが、
  • マンデルブロ集合を計算してASCIIで描画する。C++で書いて、cmakeでビルド環境まで作成
  • Pytorchを使ってMNISTのモデルを作って学習し、評価する。Pytorchの環境だけは通常のpip installでは適切なバージョンをインストールできなかったので、手動で作成
くらいは問題なく動きました。gitの操作も簡単なものであればできました。コードは長いので省略します。

このレベルならコーディングのお手伝いくらいならできそうです。 有料の強力なモデルとローカルLLMを適宜切り替えて使うのがコスト的には良いのかもしれません。

2025/04/05

OpenHandsをローカルLLMで動かす

OpenHandsをローカルLLMで動かしてみます。

OpenHandsの準備


https://github.com/All-Hands-AI/OpenHands/のQuick Startに従って、dockerを動かすだけです。 Rootless dockerでも動作します。

/var/run/docker.sockを使ってOpenHandsがdockerを制御するようでしたので、今回は、KVM上でUbuntu24.04を動作させ、その中でAllHandsを動作させました。

ollamaの準備


ローカルLLMについてはollamaで動作させます。

ollamaもdockerイメージがhttps://hub.docker.com/r/ollama/ollamaで配布されているのでそれをそのまま利用します。 こちらもrootless dockerでも動作します。

$ docker run -d --gpus=all -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama
を実行するとollamaが立ち上がります。
$ docker exec -it ollama bash
でdocker内に入って、ollamaを実行すると
root@xxxxxxxx:/# ollama
Usage:
  ollama [flags]
  ollama [command]

Available Commands:
  serve       Start ollama
  create      Create a model from a Modelfile
  show        Show information for a model
  run         Run a model
  stop        Stop a running model
  pull        Pull a model from a registry
  push        Push a model to a registry
  list        List models
  ps          List running models
  cp          Copy a model
  rm          Remove a model
  help        Help about any command

Flags:
  -h, --help      help for ollama
  -v, --version   Show version information

Use "ollama [command] --help" for more information about a command.
となり、ollamaが実行できることが確認できます。

ollamaのモデルの準備


試している環境ではGPUメモリが8GBなので、小さめのLLMを探してきます。

以下のものを試してみましたが、hhao/qwen2.5-coder-tools:7bがかろうじて動く程度で、ほかはOpenHandsで使うには適切ではないLLMでした。

hhao/qwen2.5-coder-tools:7b    1fbf62f22cd4    4.7 GB
codegemma:7b                   0c96700aaada    5.0 GB
llama3.2:3b                    a80c4f17acd5    2.0 GB
codellama:7b                   8fdf8f752f6e    3.8 GB
qwen2.5-coder:3b               e7149271c296    1.9 GB
opencoder:1.5b                 8573dfc23c16    1.4 GB
opencoder:8b                   cd882db52297    4.7 GB
もっと良いLLMがあるかもしれませんが、ここではhhao/qwen2.5-coder-tools:7bを使って進めます。runすると
/# ollama run hhao/qwen2.5-coder-tools:7b
>>> Send a message (/? for help)
と表示され、OpenHandsからアクセスできる状態になりました。試しにメッセージを入れてみると、
>>> Pythonでhelloと出力するスクリプトを作成してください
```python
print("hello")
```
とか
>>> rustでhelloと出力するコードを書いて、ビルドして実行する方法を書いてください
```json
{
  "name": "create_file",
  "arguments": {
    "filename": "main.rs",
    "content": "fn main() {\n    println!(\"Hello\");\n}"
  }
}
```
のように出力されました。日本語でも動きそうです。OpenHandsから呼び出すときにollama runが実行されている必要はありません。

OpenHandsの設定


KVM内からollamaにアクセスできることを確認します。
curl http://host.ip.address:11434/api/generate -d '{
  "model": "hhao/qwen2.5-coder-tools:7b",
  "prompt":"Write a bash script that prints hello"
}'
json形式の応答が返ってくれば、動作しています。

docker run -it --rm -e SANDBOX_RUNTIME_CONTAINER_IMAGE=docker.all-hands.dev/all-hands-ai/runtime:0.29-nikolaik \
       -e LOG_ALL_EVENTS=true \
       -e LOG_JSON=false \
       -e LOG_LEVEL=DEBUG \
       -e DEBUG=true \
       -e OLLAMA_API_BASE=http://host.ip.address:11434 \
       -v /var/run/docker.sock:/var/run/docker.sock \
       -v ~/.openhands-state:/.openhands-state \
       -p 3000:3000 \
       --add-host host.docker.internal:host-gateway  \
       --name openhands-app \
       docker.all-hands.dev/all-hands-ai/openhands:0.29
host.ip.addressは適切な値に書き換えてください。

KVM内のブラウザでlocalhost:3000にアクセスします。 左下の⚙アイコンをクリックして、

Custom model: ollama/hhao/qwen2.5-coder-tools:7b
Base URL: http://host.ip.address:11434
API Key: なんでもOK
Agent: CodeActAgent
と設定します。

これで動くようになります。指示として例えば

Could you write a bash script that just prints "こんにちは" ?
を入力すると動き始め、下図のようになりました。
ただ、ファイルはつくれたもののその後はうまく動作しなくなってしまいました。

OpenHandsを活用するには、もっと賢いLLMが必要なようです。