Ollama の動作環境の構築

解説

Jetson Orin Nano に、ローカルLLM の動作環境を構築する方法についてまとめます。

動作環境のベースとなる環境として、NVIDIA社から提供されているDockerイメージの中から、機械学習開発用のDockerイメージ「L4T ML」を利用します。

このページでは、Ollama の動作環境を構築します。

前提

Ollama の動作の際は、多くのメモリを必要します。また多くの処理時間を必要とします。また多くのディスク容量を必要とします。
これらを踏まえ、以下を実施済みの状態の Jetson Orin Nano を前提とします。

ブートデバイスのNVMe SSDへの変更
Jetson Orin Nano の既定のブートデバイスは、SDカードです。SDカードは、読み書きの速度が速くはなく、また、ディスク容量も多くはありません。ブートデバイスをNVMe SSDに変更しておきます。
参考)
Jetson Orin Nano で日本語LLMを動かしてみた
Jetson Orin NanoのNVMe SSDを使ったOSイメージのセットアップ手順 #NVIDIA - Qiita
Jetson Orin Nano開発者キットでHシリーズNVMe SSDを使う! │ HAGIWARA Solutions
デスクトップ環境の無効化
デスクトップ環境は多くのメモリを必要としますが、Ollama の動作においては必要ないので、無効化しておきます。
参考)
Memory optimization - NVIDIA Jetson AI Lab
Jetson Orin Nano で日本語LLMを動かしてみた
Llama 2をJetson Orin Nanoで起動してみる #LLM - Qiita
その他サービスを無効化
カメラ機能を使うときに動くバックグラウンドサービス「nvargus-daemon.service」は必要ないので、無効化しておきます。
参考)
Memory optimization - NVIDIA Jetson AI Lab
Jetson Orin Nano で日本語LLMを動かしてみた
Llama 2をJetson Orin Nanoで起動してみる #LLM - Qiita
スワップ領域の拡張
Jetson Orin Nano は既定では、ZRAMと呼ばれる領域に3.2Gほどのスワップ領域が作成されています。16GBのスワップ領域をNVMe SSD上に作成しておきます。また、ZRAMは無効化しておきます。
参考)
スワップ領域の確認と拡張 - hiramine.com
Memory optimization - NVIDIA Jetson AI Lab
Jetson Orin Nano で日本語LLMを動かしてみた
Llama 2をJetson Orin Nanoで起動してみる #LLM - Qiita

使用した Jetson Orin Nano は、以下についても実施済みです。

Sambaのインストール と設定
別のマシンから、ファイル操作をできるようにしておくと、何かと便利なので、Sambaをインストールしておきます。
「/home/(ログインユーザー名)」のディレクトリをSamba共有しておきます。
参考)
Sambaのインストールと設定と接続

機械学習開発用のDockerイメージ

NVIDIA社から提供されているDockerイメージの中から、Jetsonに最適化された機械学習開発用のDockerイメージ「L4T ML」を利用することとします。

提供元ページは以下です。
NVIDIA L4T ML | NVIDIA NGC

※L4T : Linux for Tegra の略です。Jetson Linuxのことです。Jetson Linuxは、以前は、Linux for Tegraという名称でした。Tegraとは、NVIDIA社のSoCシリーズの名前です。Jetsonシリーズは、NVIDIAのTegraを搭載しています。
※ML : Machine Learningの略です。機械学習のことです。

コンテナ起動コマンド

機械学習用のDockerイメージ「L4T ML」の起動コマンドは、提供元ページに記載があり、以下です。


コマンドオプション解説

-it
インタラクティブモードで実行します
--rm
コンテナを終了したらコンテナを削除します。(コンテナを終了してもコンテナを削除したくない場合は、このオプションは外します)
--runtime nvidia
l4t-base コンテナの実行中に NVIDIA コンテナランタイムを使用します。
--network host
コンテナが Jetson ホストのネットワークとポートを使用できるようにします。

イメージのタグの確認

コンテナ起動コマンドの「<tag>」については、実行する Jetson Orin Nano の環境に合わせたタグを指定する必要があります。

まず、「OSバージョンの確認」等を参考に、Jetson Linux とJetPackのバージョンを確認します。
使用している Jetson Orin Nano の、Jetson Linux のバージョンは、 36.4.4 で、JetPackのバージョンは、 6.2.1 でした。

続いて、環境に合わせたタグを、提供元ページ「NVIDIA L4T ML | NVIDIA NGC」から確認します。
2025年8月13日現在、Jetson Linux のバージョン 36.4.4 のタグは存在しないため、Jetson Linux のバージョン 36.2.0 のタグ「r36.2.0-py3」を使用します。

コンテナにマウントするホスト側のディレクトリの作成

作業用ディレクトリを作成します。作成したディレクトリは、コンテナにマウントします。

以下のコマンドを実行し、ディレクトリを作成します。今回はユーザーのホームディレクトリ下に「work-l4t-ml-ollama」というフォルダを作成することとしました。
(機械学習用のDockerイメージ「L4T ML」(l4t-ml)を利用した「Ollama」(ollama)の動作環境が構築されたコンテナの作業用(work)のディレクトリ)


ホストのディレクトリをコンテナにマウントしてコンテナを起動するコマンドの書式は以下です。

コンテナ起動スクリプトファイルの作成

コンテナ起動コマンドは文字数が多いので、実行する際にタイピングするのが少し面倒です。短い文字数のタイピングで実行できるようにスクリプトファイル化します。

今回は「docker-run-ollama.sh」というスクリプトファイルを作成することとしました。

「docker-run-ollama.sh」というスクリプトファイルを作成し、内容を以下のようにします。


コマンドオプション解説

-it
インタラクティブモードで実行します
--runtime nvidia
l4t-base コンテナの実行中に NVIDIA コンテナランタイムを使用します。
--network host
コンテナが Jetson ホストのネットワークとポートを使用できるようにします。
--volume ${HOME}/work-l4t-ml-ollama:/work
ホストの「${HOME}/work-l4t-ml-ollama」ディレクトリをコンテナの「/work」ディレクトリとしてマウントします。
--env OLLAMA_HOST=0.0.0.0:11434
環境変数「OLLAMA_HOST」を設定します。「OLLAMA_HOST=0.0.0.0:11434」と「--network host」で、Ollamaサーバーに、LAN 内からアクセスできるようにします。
--name l4t-ml-ollama-dev
起動したコンテナに「l4t-ml-ollama-dev」という名前を付けておきます。後ほどDockerイメージ化するときに付けた名前を使用します。
起動したコンテナ上で、Ollamaの動作環境を構築し、Dockerイメージ化し再利用します。そのために「--rm」オプションは付けません。
nvcr.io/nvidia/l4t-ml:r36.2.0-py3
起動するコンテナの元となるイメージとして、「nvcr.io/nvidia/l4t-ml:r36.2.0-py3」を指定します。タグは実行する Jetson Orin Nano の環境に合わせたタグにします。

以下のコマンドを実行し、スクリプトファイルに実行権限を付与します。

コンテナの起動

以下のコマンドを実行し、「L4T ML」コンテナを起動します。


初回のコンテナ起動は、コンテナイメージのダウンロードと解凍が行われるため、時間を要します。

コンテナが起動すると、Terminalでの表示が「root@ホスト名:/#」に変わり、コンテナ上での作業になります。

以降の作業は、指定がない場合は、コンテナ上での作業です。

Ollamaのダウンロードと展開

Ollamaの実行ファイルとライブラリファイルが格納されたファイルをダウンロードします。

https://github.com/ollama/ollama/releases/」にアクセスし、最新バージョンの「ollama-linux-arm64.tgz」と「ollama-linux-arm64-jetpack6.tgz」のURLを取得します。

ollama-linux-arm64.tgz : arm64用のOllamaの実行ファイルとライブラリファイルが格納されたファイルです。
ollama-linux-arm64-jetpack6.tgz : jetson用のOllamaのライブラリファイルが格納されたファイルです。実行ファイルは格納されていません。

2025年8月31日現在、Ollamaの最新バージョンは、v0.11.8。取得したURLは、以下でした。
https://github.com/ollama/ollama/releases/download/v0.11.8/ollama-linux-arm64.tgz
https://github.com/ollama/ollama/releases/download/v0.11.8/ollama-linux-arm64-jetpack6.tgz

以下のコマンドを実行し、Ollamaの実行ファイルとライブラリファイルの格納されたファイルをダウンロードします。


以下のコマンドを実行し、ダウンロードしたファイルを展開します。


「ollama-linux-arm64.tgz」を展開すると、以下のファイルが展開されます。
(「cuda_sbsa」ディレクトリのファイルは、ARMサーバー(SBSA : Server Base System Architecture)を対象にビルドしたファイルで、Jetsonには適しません。)
bin/ollama
lib/ollama/
 ├─ libggml-base.so
 ├─ libggml-cpu.so
 └─ cuda_sbsa/
    ├─ libcublas.so.12
    ├─ libcublas.so.12.8.4.1
    ├─ libcublasLt.so.12
    ├─ libcublasLt.so.12.8.4.1
    ├─ libcudart.so.12
    ├─ libcudart.so.12.8.90
    └─ libggml-cuda.so

「ollama-linux-arm64-jetpack6.tgz」を展開すると、以下のファイルが展開されます。
(「cuda_jetpack6」ディレクトリのファイルは、Jetpack6を対象にビルドしたファイルで、Jetsonに適したファイルです。)
lib/ollama/
 └─ cuda_jetpack6/
    ├─ libcublas.so.12
    ├─ libcublas.so.12.8.4.1
    ├─ libcublasLt.so.12
    ├─ libcublasLt.so.12.8.4.1
    ├─ libcudart.so.12
    ├─ libcudart.so.12.8.90
    └─ libggml-cuda.so

「ollama-linux-arm64.tgz」のファイルサイズ1.01[GB]、「ollama-linux-arm64-jetpack6.tgz」のファイルサイズ343[MB]。
以下のコマンドを実行し、ダウンロードしたファイルを削除します。

Ollamaのライブラリパスの設定

展開したライブラリファイルをOllamaが使用するように環境設定します。

以下のコマンドを実行し、Ollamaのライブラリパスの設定をします。


次回以降のコンテナ起動時にも適用されるように、「/root/.bashrc」ファイルの末尾に、以下を追記します。(ファイル名の先頭には、「ドット」がひとつあります)

LLMモデルを格納するディレクトリの変更

LLMモデルとのチャットに先だって、LLMモデルを格納するディレクトリを、コンテナ内のディレクトリから、ホスト側のディレクトリに変更します。
(Dockerイメージのファイルサイズ削減のために行います。
 この後のチャットで使用するLLMモデルファイルは、10GBほどになります。
 OllamaのLLMモデルを格納するディレクトリは、既定では、コンテナ内の「/root/.ollama/models/」です。
 LLMモデルを格納するディレクトリの変更を行わなかった場合、Dockerイメージ化の際に、LLMモデルも含めてイメージ化されます。
 LLMモデルを格納するディレクトリの変更を行った場合、Dockerイメージ化の際に、LLMモデルはイメージ化に含まれません。結果、Dockerイメージのファイルサイズ削減となります)

以下のコマンドを実行します。


次回以降のコンテナ起動時にも適用されるように、「/root/.bashrc」ファイルの末尾に、以下を追記します。(ファイル名の先頭には、「ドット」がひとつあります)

Ollamaサーバーの起動

以下のコマンドを実行し、Ollamaサーバーを起動します。コマンドの末尾に「&」を付けて、起動するサーバーをバックグラウンド実行とします。


Ollamaサーバーはバックグラウンド起動しているので、同じTerminalでコマンドの入力が可能です。

Ollamaサーバーの起動したときの、Terminal画面(Ollamaサーバー起動後、エンターキーを一度押下しています)

LLMモデルとのチャット

以下のコマンドを実行し、LLMモデルとのチャットを開始します。「https://github.com/ollama/ollama」の「Model library」のLLMモデルのリストから、チャットするLLMモデルとして「llama3.2」を選定しました。


初回実行時は、LLMモデルファイルのダウンロードがあり時間を要します。(時間は、ネットワーク環境等に依存します)

「>>> Send a message」と表示されたら、チャットができます。

画像生成の試行、初回実行時の、Terminal画面


「Hi how are you」と入力し、会話した結果


以下を入力し、チャットを終了します。

LLMモデルのダウンロード

以下のコマンドを実行し、LLMモデルをダウンロードできます。「https://github.com/ollama/ollama」の「Model library」のLLMモデルのリストから、ダウンロードするLLMモデルとして「gemma3」を選定しました。


LLMモデルファイルのダウンロードには時間を要します。(時間は、ネットワーク環境等に依存します)

コンテナの終了

以下のコマンドを実行し、コンテナを終了します。


コンテナが終了すると、Terminalでの表示が「ユーザー名@ホスト名:/~$」に変わり、ホスト上での作業に戻ります。

以降の作業は、指定がない場合は、ホスト上での作業です。

コンテナのイメージ化

以下のコマンドを実行し、コンテナをイメージ化します。

l4t-ml-ollama-dev : イメージ化するコンテナの名前
l4t-ml-ollama:v1 : 作成するイメージの名前「l4t-ml-ollama」、タグ「v1」。

不要となったコンテナの削除

以下のコマンドを実行し、不要となったコンテナを削除します。

l4t-ml-ollama-dev : 削除するコンテナの名前

作成したイメージを用いてコンテナの起動

コンテナ起動スクリプトファイル「docker-run-ollama.sh」を以下の内容に修正します。

コンテナを終了したらコンテナを削除するように「--rm」オプションを追記します。
コンテナに名前を付ける「--name」オプションは削除します。
起動するコンテナの元となるイメージを、「l4t-ml-ollama:v1」に変更します。

以下のコマンドを実行します。


構築した Ollama の動作環境のコンテナが起動します。

コンテナでの作業を終了するには「exit」コマンドを実行します。

関連ページ

Ollama の動作環境の構築 - 【本ページ】

Open WebUI の動作環境の構築