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

今回の記事は約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を今回使いました。
vLLMはLLMを高速に、かつ効率的に推論目的で動かすことが出来ます。オープンソースLLMを動かす方法だと他にはOllamaを使う、という選択肢もあります。実は最初はOllamaを使う方法で作業を進めていたのですが、OllamaがJetsonのGPUを使ってくれない、という事象が発生してしまいました。Ollamaのバージョンは0.17.7でした。結局原因は特定できなかったのですが、OllamaのGithubにJetsonでGPUのDriverがロードされない、といったissueもあがっていてちょっと問題が深そうなので、今回はOllamaを使うことを断念しました。
vLLMのドキュメントにClaude CodeをvLLMにつなげる手順がまとめられています。
こちらの手順ではopenai/gpt-oss-120bを使う例が掲載されていますが、32GBバージョンのAGX Orinではこのサイズを快適に動かすのは厳しそうなので、openai/gpt-oss-20bを使うことにしました。
Claude Codeのインストール
Claude Codeのインストールはこちらの手順を参考にしました。
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のバグのようです。
こちらの内容を参考に、必要なファイルをダウンロードしました。
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 serveでgpt-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を使ったり、そういった工夫でどこまで出来るかこれから検証が楽しみです。
