はじめに
Yocto Projectの環境でOllamaを試したい気分になった。 一からビルドするのは大変そうなので、マニュアルインストールの手順を試す。
環境構築
環境を構築する。
作業環境
$ mkdir -p ~/yocto/scarthgap $ cd ~/yocto/scarthgap
pokyの取得
$ git clone git://git.yoctoproject.org/poky.git -b scarthgap
環境変数の設定
$ source poky/oe-init-build-env
作業レイヤの作成
一緒にレシピを配置するディレクトリも作成する。
$ bitbake-layers create-layer -a ./meta-work $ mkdir -p meta-work/recipes-ai/ollama
レシピの作成
meta-work/recipes-ai/ollama/ollama-bin.bbを下記の内容で作成する。
DESCRIPTION = "Ollama binary package" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302" SRC_ARCH:x86-64 = "amd64" SRC_ARCH:aarch64 = "arm64" SRC_ARCH = "" SRC_SHA256:x86-64 = "aa386ce1c314686133f7abe9b561f3ef230f03f88bbdd1f583c951c4ab5378ad" SRC_SHA256:aarch64 = "e4d858d2aea008f45fc9a66f62480dafb322fcdb707c8fcf3361a0ee2af37e4a" python() { if not d.getVar('SRC_ARCH'): bb.fatal('Supported architectures are x86_64 or aarch64 only.') } SRC_URI = "https://ollama.com/download/ollama-linux-${SRC_ARCH}.tgz;subdir=${BP}/usr \ file://ollama.service \ " SRC_URI[sha256sum] = "${SRC_SHA256}" RDEPENDS:${PN} = "ca-certificates" INSANE_SKIP:${PN} += "already-stripped" INSANE_SKIP:${PN}-cuda += "file-rdeps" inherit bin_package systemd useradd SYSTEMD_SERVICE:${PN} = "ollama.service" do_install:append() { install -d ${D}${systemd_unitdir}/system install ${WORKDIR}/ollama.service ${D}/${systemd_unitdir}/system/ } PACKAGES =+ "${PN}-cuda" FILES:${PN}-cuda = "\ ${libdir}/ollama/cuda_* \ " FILES:${PN} = "\ ${bindir} \ ${libdir} \ ${systemd_unitdir}/system \ " USERADD_PACKAGES = "${PN}" USERADD_PARAM:${PN} = "-r -s /bin/false -U -m -d ${datadir}/ollama ollama"
ollama.serviceの作成
meta-work/recipes-ai/ollama/files/ollama.serviceを下記の内容で作成する。
[Unit] Description=Ollama Service After=network-online.target [Service] ExecStart=/usr/bin/ollama serve User=ollama Group=ollama Restart=always RestartSec=3 Environment="PATH=$PATH" [Install] WantedBy=default.target
local.confの設定
local.confに下記を追記する。
MACHINE ?= "qemuarm64" INIT_MANAGER = "systemd" QB_OPT_APPEND:append = " -echr 0x14" QB_MEM = "-m 2048" IMAGE_INSTALL:append = " ollama-bin" IMAGE_ROOTFS_EXTRA_SPACE = "5242880"
要点は下記の通り。
- ターゲットはqemuarm64
- initはsystemdに変更
- QEMUのメモリに2GiB
- ollama-binを組み込み
- ルートFSの領域を5GiB追加
今回使用したいモデルのダウンロードや推論に必要なストレージやメモリは一応足りる。
ビルド
イメージを小さくしたいのと、ollamaのレシピに必要な依存関係を整理しながら作業を進めたかったので今回はcore-image-minimalを使用した。
$ bitbake core-image-minimal
動作確認
$ runqemu nographic
ollama-binのレシピでsystemdのサービスとしてollamaが実行されるようになっているので、 ログイン直後からollamaコマンドを使用してモデルを動かすことができる。
今回動かすモデル
今回使用するモデルなどはKaito Sugimotoさんの「Ollamaで体験する国産LLM入門」にある「§2.2 Ollamaで Sarashina-2.1 1B の非公式チューニング版を動かす」を参考にさせてもらった。
ありがたや。
下記のコマンドで実行する。
$ ollama run hf.co/mmnga/sarashina2.1-1b-sft-gguf
実行画面

ラズパイ4(4GB)で動かす
レイヤの追加
この環境をベースに更に下記を実行することでラズパイ4の実機でも動作することができた。
$ bitbake-layers layerindex-fetch meta-raspberrypi
local.confの修正
#MACHINE ?= "qemuarm64" MACHINE ?= "raspberrypi4-64" INIT_MANAGER = "systemd" #QB_OPT_APPEND:append = " -echr 0x14" #QB_MEM = "-m 2048" IMAGE_INSTALL:append = " ollama-bin" IMAGE_ROOTFS_EXTRA_SPACE = "5242880" ENABLE_UART = "1"
ビルド
$ bitbake core-image-minimal
まとめ
Ollamaを組み込んでsarashina2.1-1bのモデルを動かしてみた。 結構面白い。
今回作成したレシピollama-bin.bbのままでラズベリーパイ4Bの4GBモデルでも これと同じものが動作することは確認できた。
上モノの移植が非常に簡単なのがYoctoのいいところ。
