メインコンテンツまでスキップ
もみじーな
個人開発者
すべての著者を見る

エージェント(Qwen3.5 27b)のテストとAIに実行計画させるのは大事?

· 約3分
もみじーな
個人開発者

自分用のAIエージェントアプリを作成しているのですがGithub CopilotとかManusみたいに作業中の項目が見たいので実行計画をまず立てさせてから開発させるようにしたら生成の精度がよくなりました。

実行計画の実装前・実装後どうだったか

エラーがなくてもバグが多かったりAI自体がループに入ったりしましたが計画させて作業を分割したらなぜ1回でそこそこ動くアプリを作成してくれるようになりました。
ループもあんまりしなくなった。(なぜだ?むしろループを見ていない気も)
一度に色々と考えて生成させるのが原因なのか?
ある程度制限すれば減るのか?

生成テスト

テトリスの作成テスト

画像生成はStable Diffusionを起動していないのでエラーです
立ててれば自動で画像も生成して画像確認してつかってくれます。
あとこれは生成後に背景がなかったのでテストも兼ねておしゃれにしてと命令してます。

エージェントが勝手にエラーチェックもして修正してから報告してくるので基本的にはエラーがでるとかもないです。
スタートボタンなども勝手に押してテストしてくれます。(自分でもここまで機能実装して何を目指しているのかですが)

リバーシの作成テスト

エージェントの1回の完了報告でエラーやバグ、UIがずれているかもなさそう?
このリバーシとかもそうですがQwen3.5 27bとかQwen3.5シリーズが作成したものってなんか似たり寄ったりのUIと機能になりますよね。

TODOアプリの作成テスト

TODOアプリはなんとなくテストしただけです。 普通に動くし普通に使えなくはない。

最後に

Qwen3.5 27bいいですよねやっぱ 9bとかで開発テストしてますが使うときに27bを使うとここまで違うのかと実感します。(特にUIとか)
実行計画を立てさせるのがどれくらい効果的かはわかりませんが去年、Github CopilotでClaude 3.7(記憶が曖昧)とかの時に生成させたものに近いものが作れる気もしますのでQwen4.5に期待してます。
あと1bit量子化まだか?
富士通のQEPどうなったんですかね?3月になったので公開はされてるかもしれないですが精度89%がどれくらい響くのかもありますがはやくそこそこ精度の100bレベルが32GBくらいのVRAMで動いてくれると面白いですよね。

Qwen3.5のエージェントにWikipediaのDBを与えてみた

· 約8分
もみじーな
個人開発者

※3/11に追加でベクトル化もしましたが大変よかったです。

通常のAIモデルだと学習以前のデータは間違った答えを渡してくるので少しでもデータの正確性を保つためにWikipediaのデータを自動で検索するようにしてみました。

本当はベクトル化したいですけど時間かかるぽいので今回はテストとしてやってます。
来週か再来週あたりベクトル化したいですね。

画像のように現在の総理大臣も前のも大丈夫です。
なぜか私だけさんがつかないのがこのAIへの毎回の疑問ですが・・・

ちなみLM Studioだけだとこんな感じです。

ウェブリサーチさせる方法もありますけどネットを挟むとローカルだけだと動かないですしボットは嫌われる(企業ならやめたほうがいい)ので今回はWikipediaがデータベースを配布していることもあるのでダウンロードしてSQLite FTS5にデータを変換してAIが検索できるようにしてみました。

SQLite FTS5のデータはAPIでAIが参照するようにしているので割愛しますがデータベース化の仕方だけ残しておきます。

データベース作成方法

Wikipediaのデータ自体はhttps://dumps.wikimedia.org/jawiki/ から最新をダウンロードするだけです。
jawiki-20260301-pages-articles-multistream.xml.bz2 という4.4 GBを今回はダウンロードしました。

適当に学習させるフォルダに入れておいてください。
最終的にこうなります。

準備

学習に使ったコードは以下です。

requirements.txt

mwparserfromhell

build_wiki_db.py

"""
jawiki XML.bz2 → SQLite FTS5 (wiki.db) 変換スクリプト

出力:
wiki.db (同フォルダに作成)
"""

import bz2
import re
import sqlite3
import os
import sys
import time
import gc
import xml.sax
import xml.sax.handler

DB_PATH = "wiki.db"
BATCH_SIZE = 500 # 一度にINSERTする記事数
MAX_ARTICLES = 0 # 0 = 無制限。テスト時は例えば 10000 に設定すること
CHUNK_SIZE = 1024 * 1024 # 1MB ずつ bz2 展開

def strip_markup(text: str) -> str:
if not text:
return ""

# コメント除去
text = re.sub(r'<!--.*?-->', '', text, flags=re.DOTALL)
# <ref> タグ除去
text = re.sub(r'<ref[^>]*>.*?</ref>', '', text, flags=re.DOTALL)
text = re.sub(r'<ref[^/]*/>', '', text)
# その他HTMLタグ除去
text = re.sub(r'<[^>]+>', '', text)
# {{テンプレート}} 除去(ネスト対応・最大5段)
for _ in range(5):
prev = text
text = re.sub(r'\{\{[^{}]*\}\}', '', text)
if text == prev:
break
# [[File:...]] [[Image:...]] 除去
text = re.sub(r'\[\[(?:File|Image|ファイル|画像):[^\]]*\]\]', '', text, flags=re.IGNORECASE)
# [[リンク|表示テキスト]] → 表示テキストのみ残す
text = re.sub(r'\[\[[^\]|]*\|([^\]]*)\]\]', r'\1', text)
# [[リンク]] → テキストのみ残す
text = re.sub(r'\[\[([^\]]*)\]\]', r'\1', text)
# [URL 表示] → 表示テキスト
text = re.sub(r'\[https?://\S+\s+([^\]]+)\]', r'\1', text)
# 単独URL除去
text = re.sub(r'\[https?://\S+\]', '', text)
# 見出し記号除去
text = re.sub(r'={2,}(.+?)={2,}', r'\1', text)
# 太字・斜体
text = re.sub(r"'{2,3}", '', text)
# 表・wikitable
text = re.sub(r'^\s*[|!{][^\n]*', '', text, flags=re.MULTILINE)
# 余白整理
text = re.sub(r'\n{3,}', '\n\n', text)
return text.strip()


class WikiHandler(xml.sax.handler.ContentHandler):
"""
XML要素をツリーに蓄積せず、文字列バッファのみ使用。
メモリ使用量は記事1件分のテキストのみ (数KB〜数百KB)。
"""

def __init__(self, on_article):
super().__init__()
self._on_article = on_article
self._in_page = False
self._in_revision = False
self._tag = None
self._title_buf = []
self._ns_buf = []
self._text_buf = []

def startElement(self, name, attrs):
if name == 'page':
self._in_page = True
self._in_revision = False
self._title_buf = []
self._ns_buf = []
self._text_buf = []
self._tag = None
elif name == 'revision' and self._in_page:
self._in_revision = True
if name in ('title', 'ns') and self._in_page:
self._tag = name
elif name == 'text' and self._in_page and self._in_revision:
self._tag = name

def endElement(self, name):
if name in ('title', 'ns', 'text'):
self._tag = None
elif name == 'revision':
self._in_revision = False
elif name == 'page':
self._in_page = False
ns = ''.join(self._ns_buf).strip()
title = ''.join(self._title_buf).strip()
text = ''.join(self._text_buf)
self._title_buf = []
self._ns_buf = []
self._text_buf = []
if ns == '0' and title and text \
and not text.lstrip().startswith('#REDIRECT') \
and not text.lstrip().startswith('#転送'):
self._on_article(title, text)

def characters(self, content):
if not self._in_page or self._tag is None:
return
if self._tag == 'title':
self._title_buf.append(content)
elif self._tag == 'ns':
self._ns_buf.append(content)
elif self._tag == 'text':
self._text_buf.append(content)


class _StopBuild(Exception):
pass


# ── DB構築 ───────────────────────────────────────────────
def build_db(dump_path: str):
print(f"入力ファイル : {dump_path}")
print(f"出力DB : {DB_PATH}")
print("─" * 50)

con = sqlite3.connect(DB_PATH)
cur = con.cursor()
cur.executescript("""
PRAGMA journal_mode = WAL;
PRAGMA cache_size = -32000;
PRAGMA temp_store = FILE;
PRAGMA mmap_size = 0;
""")

cur.executescript("""
DROP TABLE IF EXISTS wiki;
CREATE VIRTUAL TABLE wiki USING fts5(
title,
body,
tokenize = 'unicode61'
);
""")
con.commit()

batch = []
count = [0]
t0 = time.time()

def on_article(title: str, text: str):
body = strip_markup(text)
if len(body) < 50:
return
batch.append((title, body))
count[0] += 1
if len(batch) >= BATCH_SIZE:
cur.executemany("INSERT INTO wiki(title, body) VALUES (?, ?)", batch)
con.commit()
batch.clear()
elapsed = time.time() - t0
rate = count[0] / elapsed
print(f"\r{count[0]:,} 件処理済 ({rate:.0f} 件/秒)", end='', flush=True)
if count[0] % 5000 == 0:
gc.collect()
if MAX_ARTICLES and count[0] >= MAX_ARTICLES:
raise _StopBuild()

handler = WikiHandler(on_article)
parser = xml.sax.make_parser()
parser.setFeature(xml.sax.handler.feature_namespaces, False)
parser.setContentHandler(handler)

opener = bz2.open if dump_path.endswith('.bz2') else open
try:
with opener(dump_path, 'rb') as f:
while True:
chunk = f.read(CHUNK_SIZE)
if not chunk:
break
parser.feed(chunk)
parser.close()
except _StopBuild:
pass
except xml.sax.SAXParseException as e:
print(f"\n[警告] XML解析終了: {e}")

if batch:
cur.executemany("INSERT INTO wiki(title, body) VALUES (?, ?)", batch)
con.commit()

elapsed = time.time() - t0
print(f"\n{'─'*50}")
print(f"完了: {count[0]:,} 記事 所要時間: {elapsed/60:.1f} 分")
if os.path.exists(DB_PATH):
print(f"DBサイズ: {os.path.getsize(DB_PATH) / 1024**3:.2f} GB")
con.close()


# ── 検索テスト ────────────────────────────────────────────
def test_search(query: str, limit: int = 5):
if not os.path.exists(DB_PATH):
print("wiki.db が見つかりません。先に build を実行してください。")
return
con = sqlite3.connect(DB_PATH)
cur = con.cursor()
rows = cur.execute(
"SELECT title, snippet(wiki, 1, '[', ']', '...', 20) FROM wiki WHERE wiki MATCH ? ORDER BY rank LIMIT ?",
(query, limit)
).fetchall()
con.close()
if not rows:
print(f"「{query}」に一致する記事が見つかりませんでした。")
return
for i, (title, snip) in enumerate(rows, 1):
print(f"\n[{i}] {title}")
print(f" {snip}")


# ── エントリーポイント ────────────────────────────────────
if __name__ == '__main__':
if len(sys.argv) >= 2:
cmd = sys.argv[1]
if cmd == 'search':
q = ' '.join(sys.argv[2:]) if len(sys.argv) > 2 else '機械学習'
test_search(q)
else:
# 引数をダンプファイルとして扱う
build_db(cmd)
else:
# 自動検索
candidates = [f for f in os.listdir('.') if f.endswith('.xml.bz2')]
if not candidates:
print("エラー: *.xml.bz2 ファイルが見つかりません。")
print("使い方: python build_wiki_db.py <ダンプファイル>")
sys.exit(1)
build_db(candidates[0])

私がbatファイルで起動したいので作成してます。
build.bat

@echo off
chcp 65001 > nul
echo ============================================
echo Wikipedia FTS5 DB ビルダー
echo ============================================
echo.

:: Python確認
python --version > nul 2>&1
if %errorlevel% neq 0 (
echo [エラー] Python が見つかりません。
echo Python 3.8以上をインストールしてください。
pause
exit /b 1
)

:: 依存ライブラリインストール
echo [1/2] 依存ライブラリをインストール中...
pip install -r requirements.txt
if %errorlevel% neq 0 (
echo [エラー] pip install に失敗しました。
pause
exit /b 1
)

echo.
echo [2/2] wiki.db を構築します(数十分かかります)...
echo 処理中はウィンドウを閉じないでください。
echo.

python build_wiki_db.py

if %errorlevel% neq 0 (
echo.
echo [エラー] ビルドに失敗しました。
pause
exit /b 1
)

echo.
echo ============================================
echo 完了! wiki.db が作成されました。
echo ============================================
echo.
pause

batファイル起動

batファイル実行したらこんな感じですね

完了

私の環境では20分程度で終わりました。

API実装などは自由に

12GB程度のデータベースが生成されますがデータベースなので自由に組み込めるはずです。
最新のデータがほしくなったら都度、DBを更新する必要がありますがある程度のデータには答えてくれるようになります。

最後に

そもそも現状のローカルAIに求めすぎな気がするんですよね所詮はローカルです。
物足りないならクラウドを使うべきだとは思いますがローカルで楽しみたいですよね・・・

もし時間に余裕があるならembedding,ベクトル化することをお勧めします。
精度が多分ですが全然違います。

追加でベクトル化もしました(2026/03/11)

結局、次の日にembeddingを作成しましたが更新してなかったので書いておきますが
embed + FTS5ハイブリッド検索に切り替えた方が確実に精度が上がります。
これは確実です。
FTS5だけだったときは時々違うデータが入っていたのでそれはなくなりました。

DB→embed作成で所要時間はRTX5090で50分かからなかったのでこの精度ならやる価値はあると思いますが最新データがどうしてもほしい場合だけです。

せっかくなのでコーディング用に次はBigCodeとか試して見ようと思いますがどれくらい精度があがってくれるか楽しみです。

Qwen3.5搭載のAIエージェントを作れば案外使える

· 約2分
もみじーな
個人開発者

Gensparkを契約しようか考えてたのですがManusと同じく一瞬でクレジットなくなるので微妙なんですよね。
あとGensparkは画像を集めろと命令しても著作物はあつめ・・なんでもないです。

なので自作してますが少なくとも作るのは難しくないです。
データベースも自分しか使わないのでSQLiteにしてるので楽ですね。

今は色んなオープンソースやライブラリがあるので結構いい感じに個人用なら作成が可能です。
Qwen3.5の9bと2bなどで切り分けて使えるようにしてますが27bとかでもいいですが速度がちょっとって感じですね。
gpt-oss-20bとかでもそりゃいいですけど画像が使えないです。

動作動画も張っておきます。

AIのエンドポイントはLM StudioとOpenRouterに対応させてるのでローカルでもクラウドでも可能にしてます。

ウェブリサーチもPlaywrightでいい感じになってますが精度があまりまだよくないですしエージェントに画像生成も組み込ませたいのでまだまだ理想のエージェントは遠そうです。

Qwen3.5 Small(0.8b,2b,4b,9b)の画像認識テスト(内容を訂正しました)

· 約2分
もみじーな
個人開発者

※3月4日にかなり修正してます


帰ってきて適当に作ってデバッグログみない自分が悪いのですが昨日作成した分は補助モードに勝手に入っており綺麗にできていただけでした。

補助モードを実装した理由は生成失敗によるミスをなくすためでしたがそれが悪さをしてましたね・・・

補助モードを削除したうえでOpenCVで画像加工処理するように変更しました。

結局,2Bが一番組み込むならいいです。

Thinkingもなんとかきれました。
9Bでも爆速です。

もうしばらくは満足です。

昨日(3月3日)までの分↓
動画はあれみて4bすごいと思われないように限定公開にしました。

小さくて画像認識精度が高いモデルを日頃さがしてるのですがQwen3.5 4Bはかなりよかったです。

テトリス作って画像認識操作テストした動画です。
Qwen3-VL-4Bから2Bまでは処理できてませんがQwen3.5 4Bから圧倒的です。
もちろん画像認識精度だけの問題ではないですが性能がここまであがるとこれからが楽しみです。
ロボットとかドローンとかに組み込めば面白そう?

このクラスが2Bにおさえられたら夢が広がりますがとりあえずQwen3.5 4Bでここまで動くならよさそうです。

ホールド機能つけてないので配置がおかしいところがありますが私がテトリスやるより早いですたぶん・・・・

NZXT H5 Flowを買ったから年内PCを組む

· 約1分
もみじーな
個人開発者

NZXT H5 Flow NieR SQUARE ENIX 15th Anniversary Editionを結局、買いましたね。

売り切れてたらいいやと思ってたんですが昼頃にビックカメラ見たらなぜか少し安く売ってました。
Xとかでも完売みたいな話だったのでビックカメラで売っていることに誰も気づいてなかったんですかね?

昨日,Hyte Y70届いたばっかだけど来年でるだろうRTX6090用にしたいので来年組む予定です。

こいつ何個PCケース買ってるんだって話なんですがね・・・

今見たらまだ在庫あるんですが価格は正常値になってました。

時間があるときにR9700を買おうと思いますがB70の販売があるならそっち買うかもしれないですね。

所詮、AIようなのでCPUは適当に買う予定です。

DDR6でるならそっちがいいんですが現状はDDR4とかでも別に・・・

HYTE Y70 Firefly Limited Editionが届いた

· 約1分
もみじーな
個人開発者

買ったのすら忘れていましたがHYTE Y70 Firefly Limited Editionが届いてしまいました・・・

ConoHaの抽選で当たったバレンタインキーホルダーと比較してますが・・

ケースでかすぎるんよ
A4との比較

一応,割れてないか確認で開封

銀狼版もまだ所持在庫があるので暫くは組まないですがそのうちなんか組みます。

明日,2BコラボのH5 FLOW NieR 15TH ANNIVERSARY EDITIONがでるらしいので狙ってたのですがどうしよかな・・・・

2BコラボケースにRadeon AI PRO R9700でも買って組もうかと思ってたのでちょっと考え中(ケースに入るかは不明)

VPSを強制終了したらOSが壊れかけた話(教訓)

· 約2分
もみじーな
個人開発者

移行が終わって不要なVPSを終了して放置してたのですがふとあの設定どうしてたのかなと思い契約期限切れ前に起動しなおしたらVPSに接続ができませんでした。

コントロールパネルのコンソールから見てみると以下のような画面が

VPS使っててはじめてみました。

まぁ、移行は済んでいるので気持ちは楽でしたね。

リカバリーモードはやってみましたが直らなかったです。

どうしても設定を見たいのもありしかたないのでGrubにinit=/bin/bash追加してシリアル画面に変えたらinitramfsが起動してくれたので助かりました。

画像ではvda1ですが違ったのでfsck -y /dev/vda2をしてexitで出たらなんとか起動したけど今回の原因はVPSを強制終了したせいですね。

さすがに通常使用環境ではしないですけど強制終了って怖いですね・・・

次からはコントロールパネルのシャットダウンボタンを押します・・・

Intel ArcでLora学習するたのメモ(Pony)

· 約4分
もみじーな
個人開発者

IntelでLora学習するためのメモですがIntel Arc Pro B60でしかテストしてないので他で動くのか不明
VRAMが20GB超えるのでoptimizerの変更が必要かも

寝る前にテストしたやつをまとめました。
Githubにbatファイルで動作テストしたやつ上げましたので必要があればそっちを
Githubはこちら

学習するための手順

必要かも

エラーが出た記憶もあるので必要ならインストールしてください。
Docker触ってた時のメモかもしれないので不明(たぶんいらない)
1.base-toolkit
インストール後 以下を実行する。

& "C:\Program Files (x86)\Intel\oneAPI\setvars.bat"

2.vc_redist.x64.exeまたは[https://learn.microsoft.com/ja-jp/cpp/windows/latest-supported-vc-redist?view=msvc-170]

準備

PowerShellを使うので必要があれば

Set-ExecutionPolicy RemoteSigned -Scope CurrentUser -Force

ダウンロード

git clone https://github.com/ostris/ai-toolkit.git
cd ai-toolkit

環境を構築する

venvはお好み
今回は除外
install順番は崩さないでください。

python -m pip install --upgrade pip
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/xpu
pip install intel-extension-for-pytorch
pip install psutil
pip show psutil
pip install intel-extension-for-pytorch --index-url https://pytorch-extension.intel.com/release-whl/stable/xpu/us/

バージョン確認

ここでエラーがでると失敗しています。

python -c "import torch; print('PyTorch Version:', torch.__version__)"

bitsandbytesを置き換え

(Get-Content requirements.txt) | Where-Object { $_ -notmatch "bitsandbytes" } | Set-Content requirements.txt

依存関係のインストール

pip install -r requirements.txt

CUDAの記述をXPU用に書き換え

PowerShellで実行
Intelの良いところはここです。
置き換えるだけで基本的に動きます。
注意として同一フォルダ内でvenvで環境つくってると中身置き換えれられるのでフォルダを除外してください。

Get-ChildItem -Path . -Filter "*.py" -Recurse | ForEach-Object {
$content = Get-Content $_.FullName -Raw

# 3つのパターンを置換
# 1. "cuda" -> "xpu"
# 2. 'cuda' -> 'xpu'
# 3. .cuda() -> .to("xpu")

$newContent = $content -replace '"cuda"', '"xpu"' `
-replace "'cuda'", "'xpu'" `
-replace '\.cuda\(\)', '.to("xpu")'

# 変更があった場合のみ保存
if ($content -ne $newContent) {
Write-Host "Modifying: $($_.FullName)"
$newContent | Set-Content $_.FullName -NoNewline
}
}

学習設定ファイル (yaml) の作成

今回はconfig/myscript_b60.yaml として保存してください。
設定はサンプルなので修正してください。

job: extension
config:
# Lora名を下に記入してください
name: "my_pony_lora"
process:
- type: 'sd_trainer'
training_folder: "output"
device: "xpu" # Intel Arc

# モデル設定
model:
# ここにダウンロードしたPonyのファイルのパスを書いてください
name_or_path: "C:/Users/momijiina/Documents/ponyDiffusionV6XL_v6StartWithThisOne.safetensors"

is_flux: false
is_xl: true
quantize: false

# ネットワーク設定
network:
type: "lora"
linear: 16
linear_alpha: 16

# 学習設定
train:
batch_size: 1
steps: 1500
gradient_accumulation_steps: 1
train_unet: true
train_text_encoder: false
content_or_style: "balanced"
#optimizer: "adamw"
optimizer: "adafactor"
lr: 1e-4

# データセット設定
datasets:
# 画像フォルダのパスをここに記入してください
- folder_path: "C:/Users/momijiina/Documents/lora"
caption_ext: "txt"
caption_dropout_rate: 0.05
shuffle_tokens: false
cache_latents_to_disk: true
resolution: [1024, 1024]

# サンプル生成設定
sample:
sampler: "ddim"
sample_every: 100
width: 1024
height: 1024
prompts:
- "score_9, score_8_up, score_7_up, source_anime, simple background, 1girl, standing"
neg: "score_6, score_5, score_4"
seed: 42
walk_seed: true
guidance_scale: 7.0
sample_steps: 28

学習開始

とりあえずは動くはずです。
私の環境では・・・

python run.py config/myscript_b60.yaml

Ubuntu25でllm-scalerのvllmもテストする

· 約4分
もみじーな
個人開発者

WSLで動かないですしUbuntu 24だとGPU2枚だとエラーが出て使えなかったので公式推奨のサポート期限切れのUbuntu 25.04をインストールしてみました。

とりあえず最初にもう言っておきますがさすが推奨バージョンです。
マニュアル通り基本動きます。
あとWSLと内容が重複してます。

準備

ドライバーインストール

公式を一応みてください
dgpu-docs-intel

sudo apt-get update
sudo apt-get install -y software-properties-common
sudo add-apt-repository -y ppa:kobuk-team/intel-graphics
sudo apt-get install -y libze-intel-gpu1 libze1 intel-metrics-discovery intel-opencl-icd clinfo intel-gsc
sudo apt-get install -y intel-media-va-driver-non-free libmfx-gen1 libvpl2 libvpl-tools libva-glx2 va-driver-all vainfo
sudo apt-get install -y libze-dev intel-ocloc
sudo apt-get install -y libze-intel-gpu-raytracing

base-toolkitをインストール

公式を見てください
base-toolkit

Ubuntu25も更新しないとパッケージは見つかりません。

公開鍵の取得

wget -O- https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB \
| gpg --dearmor | sudo tee /usr/share/keyrings/oneapi-archive-keyring.gpg > /dev/null

リポジトリの追加

echo "deb [signed-by=/usr/share/keyrings/oneapi-archive-keyring.gpg] https://apt.repos.intel.com/oneapi all main" \
| sudo tee /etc/apt/sources.list.d/oneAPI.list

インストール

終わったらrebootかけてください

sudo apt update
sudo apt install intel-oneapi-base-toolkit

GPUの認識確認

export LD_LIBRARY_PATH=""
source /opt/intel/oneapi/setvars.sh --force
sycl-ls

llm-scalerのvllmをdockerでインストール

現在はlatestも1.3なので確認してください。
一覧

sudo docker run -it --name my-vllm \
--privileged \
--net=host \
--device=/dev/dri \
--name=lsv-container \
-v /home/intel/LLM:/llm/models/ \
-e no_proxy=localhost,127.0.0.1 \
-e http_proxy=$http_proxy \
-e https_proxy=$https_proxy \
--shm-size="16g" \
--entrypoint /bin/bash \
intel/llm-scaler-vllm:1.3

モデルのダウンロード

最初にモデルダウンロードしたほうが絶対いいですね・・・

huggingface-cli download deepseek-ai/DeepSeek-R1-Distill-Qwen-7B --local-dir DeepSeek-R1-Distill-Qwen-7B

gpt-oss-20b

huggingface-cli download openai/gpt-oss-20b --local-dir /llm/models/gpt-oss-20b

実行する

gpt-ossはbfloat16で大丈夫みたいですね
float16でやったり前はしてたので今回のバージョンはしっかりエラーでたのでわかりました。

VLLM_ALLOW_LONG_MAX_MODEL_LEN=1 \
VLLM_WORKER_MULTIPROC_METHOD=spawn \
vllm serve \
--model /llm/models/gpt-oss-20b \
--served-model-name gpt-oss-20b \
--quantization mxfp4 \
--dtype bfloat16 \
--host 0.0.0.0 \
--port 8000 \
--trust-remote-code \
--gpu-memory-util 0.9 \
--max-model-len 8192
-tp 2

速度はどれくらいでるのか

1枚も2枚も速度差はなかったです。
最大70token/sなのでLM Studio以下ですね。
今,LM Studioなら80token/s以上一応でてますので・・・・

途中でモニターを4Kに変えたので見ずらいですけど編集めんどくさいのでズームしてください(必要なら)

一応、以下を実行してます。

curl http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-oss-20b",
"messages": [
{"role": "user", "content": "Hello! How are you?"}
],
"max_tokens": 4096
}'

ArcシリーズはやっぱりWindowsでのほうが速そうですね。
llm-scalerのomniももしかしたらテストするかもしれないです。

Wan2.2をGPU2枚で実行できるらしい?ので

ConoHa VPSのL4でLora学習する

· 約3分
もみじーな
個人開発者

ConoHa VPSのL4でLora学習するためのメモです。
Google Colabとどっちがいいかと言われればどっちもメリットかデメリットあるので好きな方をColab Pro+の方が財布には優しいです。
Colab Proもバックグラウンド実行できるならよかったんですけどね。
長時間作業してると間違ってブラウザ閉じたり再起動されたりするのでバックグラウンド実行(最低Colab Pro+)はほしいです。

あと学習させる画像によってはBanされるリスクがあるのでね?

長いので開発の方に入れてもよかったですけど今回はblog側に

準備

アップデート

立てたばっかなので更新

sudo apt -y update && sudo apt -y upgrade

Nvidiaのドライバーインストール

curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | 
sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
&& curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

ドライバーをインストール

sudo ubuntu-drivers autoinstall

再起動は必須

体感で5分くらいかかった気がする長い

sudo reboot

確認

sudo nvidia-smi

python3をインストールする

pythonはaptで十分です

sudo apt install python3.10-venv
sudo apt install python3-dev

ai-toolkitのインストール

基本公式通りに
エラーは特にでなかった

git clone https://github.com/ostris/ai-toolkit.git
cd ai-toolkit
python3 -m venv venv
source venv/bin/activate
pip3 install --no-cache-dir torch==2.7.0 torchvision==0.22.0 torchaudio==2.7.0 --index-url https://download.pytorch.org/whl/cu126
pip3 install -r requirements.txt

起動テストする

nodejsを使うのでインストール
aptでいれたら古かったですね

sudo apt -y install nodejs npm
sudo npm install n -g
sudo n lts

WebUI使うのでパスワードを設定しておく必要があります。
super_secure_passwordは公式初期パスワードなので長く使うなら変更してください。

cd ui
AI_TOOLKIT_AUTH=super_secure_password npm run build_and_start

ポート開放とか

どうせすぐ消すので直接
ConoHaはコントロールパネルからも許可が必要

sudo ufw allow 8675
ufw reload

Screenコマンドで一時的に動かす

screen
AI_TOOLKIT_AUTH=super_secure_password npm run build_and_start

起動後はCtrl+A+Dとかで抜けれます。

Lora学習を開始する

WebUIへアクセスする

初めてパスワード画面みたので新鮮です。

Z-Image-Turboを学習する

VRAM 24GBあるのでせっかくならZ-Image-Turboを学習する
ちょうど学習したいやつあったのでdatasetsフォルダに新しくフォルダ作ってRLoginから放り込みました。

設定はこれでいいかでやりました

とりあえず学習を開始してから6時間くらいで完了してたと思います。

私はローカルでいいかな。