Vポイントマーケティング|TECH LABの Tech Blog

TECH LABのエンジニアが技術情報を発信しています

ブログタイトル

Jetson AGX Orin 32GBに自分専用Claude Code環境を作ってみた。

こんにちは、CCCMKホールディングスAIエンジニアの三浦です。

私は普段Github Copilotを開発に使っています。一方Claude Codeについては気になっていたもののどこに環境用意しようかな・・・と考えるのにとどまっていました。

Claude Codeについて調べていると、Claude Codeはなんと使用するLLMにローカルLLMを設定できることを知りました・・・!ローカルLLMで出来るならトークン消費量を気にせずにClaude Codeを試すことが出来そうです。

そして私の手元にはJetson AGX Orin 開発者キット(32GB)があります。Jetson AGX Orin開発キットで色々やった記事はこれまで何個か公開しています。

techblog.cccmkhd.co.jp techblog.cccmkhd.co.jp techblog.cccmkhd.co.jp

Jetson AGX Orin開発者キット

Jetson AGX Orinであれば小型で場所を取りませんし、たとえOSが壊れたとしてもすぐに修復できます。Jetson AGX OrinでローカルLLMを動かしてClaude Codeも動かせれば自分専用のClaude Code環境を所有することが出来る!・・・そう思って作業を始めたのですが、かなり細かい調整が必要で、想像以上に大変な作業となりました・・・。

しかし苦労の果てに、なんとかJetson AGX OrinにClaude Code環境を作ることが出来ました!

このClaude Code, Jetsonで動いてます。

今回の記事は約2日ほどの苦戦の末にたどり着いた、Jetson AGX OrinでClaude Codeを動かすまでの手順をご紹介します!

Jetson AGX Orin開発キット(32GB)の環境

使ったJetson AGX OrinにはJetPack 6.2.2をインストールしました。別のUbuntu PCをUSBで接続し、NvidiaのSDK Managerを使ってJetson AGX OrinにJetPackを書き込みました。

Claude Codeを動かす構成

vLLMでローカルLLMを動かす

Jetson AGX OrinでLLMを動かすためのライブラリとして、vLLMを今回使いました。

docs.vllm.ai

vLLMはLLMを高速に、かつ効率的に推論目的で動かすことが出来ます。オープンソースLLMを動かす方法だと他にはOllamaを使う、という選択肢もあります。実は最初はOllamaを使う方法で作業を進めていたのですが、OllamaがJetsonのGPUを使ってくれない、という事象が発生してしまいました。Ollamaのバージョンは0.17.7でした。結局原因は特定できなかったのですが、OllamaのGithubにJetsonでGPUのDriverがロードされない、といったissueもあがっていてちょっと問題が深そうなので、今回はOllamaを使うことを断念しました。

vLLMのドキュメントにClaude CodeをvLLMにつなげる手順がまとめられています。

docs.vllm.ai

こちらの手順ではopenai/gpt-oss-120bを使う例が掲載されていますが、32GBバージョンのAGX Orinではこのサイズを快適に動かすのは厳しそうなので、openai/gpt-oss-20bを使うことにしました。

Claude Codeのインストール

Claude Codeのインストールはこちらの手順を参考にしました。

code.claude.com

Jetson AGX OrinでClaude Codeを使うための工夫

とにかく頭を悩ませたのがJetson AGX Orinの全体で約57GBというストレージ容量です。あまり考えずにJetPackをインストールして色々使わないライブラリ等も入れてしまったため、すでに23GB程度使ってしまっている状態です。そんな中で数GB~数10GBクラスのDockerイメージやLLMをダウンロードしようとすると即座にストレージを食いつぶしてしまいました。

結局USBメモリを別途調達し、ストレージを追加することにしました。USBメモリに特にサイズが大きくなる/var/lib/containerdやvLLMのキャッシュやモデルファイルを保存するようにしました。

/var/lib/containerdをUSBメモリに保存するようにした際に実行したコマンドです。正直なところUSBメモリを保存先にしたことで、Dockerコンテナの起動がかなり遅くなってしまったと思います。苦し紛れな対応策なので、もう少しよい方法を探したいです。

sudo systemctl stop containerd
sudo mkdir -p /mnt/usb/containerd #保存先
sudo rsync -aHAX --info=progress2 /var/lib/containerd/ /mnt/usb/containerd/
sudo mv /var/lib/containerd /var/lib/containerd.bak #バックアップ
sudo mkdir -p /var/lib/containerd 
sudo mount --bind /mnt/usb/containerd /var/lib/containerd #USBメモリを保存先にする
sudo systemctl start containerd

あともう一点、重たいファイルをダウンロードする際は有線LANを接続して行った方が絶対に良いです。ダウンロードする速度がかなり変わりますし、ダウンロードに失敗する回数もかなり抑えることが出来ます。

vLLMでgpt-oss-20bを動かすための準備

vLLMのvllm serveコマンドでgpt-oss-20bを動かそうとするとopenai_harmony.HarmonyError: error downloading or loading vocab file: failed to download or load vocabというエラーが発生しました。これはvLLMのGPT-OSSのページのTroubleShootingによると、openai_harmonyのバグのようです。

docs.vllm.ai

こちらの内容を参考に、必要なファイルをダウンロードしました。

sudo mkdir -p /mnt/usb/tiktoken_encodings

sudo curl -L \
  -o /mnt/usb/tiktoken_encodings/o200k_base.tiktoken \
  https://openaipublic.blob.core.windows.net/encodings/o200k_base.tiktoken

sudo curl -L \
  -o /mnt/usb/tiktoken_encodings/cl100k_base.tiktoken \
  https://openaipublic.blob.core.windows.net/encodings/cl100k_base.tiktoken

vLLMでgpt-oss-20bを動かす

Jetson AGX Orin用のvLLMのDockerイメージがあるのでそれを使ってvLLMを起動し、vllm servegpt-oss-20bをロードしてサービングします。

コマンドは以下のようになります。正直なところ、試行錯誤の果てにやっと動かすことが出来た、というものなので、まだまだ最適化には手が付けられていません・・・。

sudo docker run --rm -it \
  --name=vllm \
  --runtime=nvidia \
  --network host \
  --shm-size=16g \
  --ulimit memlock=-1 \
  --ulimit stack=67108864 \
  -e CUDA_VISIBLE_DEVICES=0 \
  -e HF_HOME=/root/.cache/huggingface \
  -e HF_HUB_CACHE=/root/.cache/huggingface/hub \
  -e HUGGINGFACE_HUB_CACHE=/root/.cache/huggingface/hub \
  -e TMPDIR=/tmp \
  -e TIKTOKEN_ENCODINGS_BASE=/tiktoken_encodings \
  -v /mnt/usb/tiktoken_encodings:/tiktoken_encodings \
  -v /mnt/usb/hf-cache:/root/.cache/huggingface \
  -v /mnt/usb/vllm-cache:/root/.cache/vllm \
  -v /mnt/usb/tmp:/tmp \
  -v /mnt/usb/harmony-cache:/root/.cache/harmony \
  ghcr.io/nvidia-ai-iot/vllm:latest-jetson-orin \
  vllm serve openai/gpt-oss-20b \
  --served-model-name gpt-oss-20b \
  --host 0.0.0.0 \
  --port 8000 \
  --tensor-parallel-size 1 \
  --pipeline-parallel-size 1 \
  --data-parallel-size 1 \
  --distributed-executor-backend uni \
  --gpu-memory-utilization 0.70 \
  --enable-auto-tool-choice \
  --tool-call-parser openai

Claude Codeを起動する

vLLMが無事に動いたら、今度はClaude Codeを起動します。起動する際にLLMのサーバーの指定や使用するLLMのモデル名を指定します。

コマンドは以下のようになりました。

ANTHROPIC_BASE_URL=http://127.0.0.1:8000 \
ANTHROPIC_API_KEY=dummy \
ANTHROPIC_AUTH_TOKEN=dummy \
ANTHROPIC_MODEL=sonnet \
ANTHROPIC_DEFAULT_SONNET_MODEL=gpt-oss-20b \
claude --model sonnet

Claude Codeが立ち上がってvLLMのLLMを使った開発がこれから出来るはず・・・です! 私は現在ローカル環境で別のPCからJetson AGX OrinにSSH接続してClaude Codeを使っています。

まとめ

ということで、今回はJetson AGX Orin開発者キット(32GB)でClaude Codeを動かすまでの手順をまとめてみました。以前IoT周りに携わっていた時にも感じたのですが、デバイスが小型な分使用できるリソースも限られているためJetsonを扱う時はところどころ細かい調整が求められます。大変なことも多いですが、勉強になることもたくさんありました。

あとはこのClaude Codeの環境でどこまで出来るのか気になるところです。MCPを使ったりAgent Skillsを使ったり、そういった工夫でどこまで出来るかこれから検証が楽しみです。

コードは書いてくれているみたいです。