以下の内容はhttps://mickey-happygolucky.hatenablog.com/entry/2025/02/19/075407より取得しました。


Yocto ProjectでOllamaを試す

はじめに

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のいいところ。




以上の内容はhttps://mickey-happygolucky.hatenablog.com/entry/2025/02/19/075407より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14