ハマったので残しておく。
前提条件
- GitHubにMastodon本家をForkしたリポジトリがあり、そこをベースに運用している。
git remote -v
の状態が以下の通りで、origin/mainが本番運用ブランチ。mastodon https://github.com/mastodon/mastodon.git (fetch) mastodon https://github.com/mastodon/mastodon.git (push) origin https://github.com/Lycolia/lycodon.git (fetch) origin https://github.com/Lycolia/lycodon.git (push)
やり方
- マージブランチを作る
git checkout -b merge-latest
- 本家を取ってくる
git fech mastodon
- マージブランチにマージする
git merge mastodon/main
- セットアップする
# swich user sudo su - mastodon # install bundle install yarn install # DBがアカンことがあるので叩いておく RAILS_ENV=production bundle exec rails db:migrate # いつものリビルド RAILS_ENV=production bundle exec rails assets:clobber RAILS_ENV=production bundle exec rails assets:precompile exit # 再起動 sudo systemctl restart mastodon-web mastodon-sidekiq mastodon-streaming
- 動作確認OKなら
git push
してGitHub上で自分のところのmainにマージする。デフォルトでは本家に向くので注意 - もう一度、前述4番のセットアップコマンド一式を流し、問題なければ終わり
トラブルシュート
正常に動いていない場合
ジャーナルを見てエラー原因を特定する。新規要素がらみのパラメーターが出てたらDBが怪しいのでRAILS_ENV=production bundle exec rails db:migrate
で直る可能性がある。
sudo journalctl -u mastodon-web -f
If the version you need is missing, try upgrading ruby-build.といわれる場合
以下のコマンドを叩いてruby-buildを更新するといける
cd "$(rbenv root)"/plugins/ruby-build
git pull
なんか昔のやり方が使えなくなってたので調べたメモ。
確認環境
Env | Ver |
---|---|
OS | Ubuntu 24.04.3 LTS |
Docker | version 28.1.1, build 4eba377 |
Docker Compose | v2.35.1 |
Mastodonのバージョン | v4.5.0-alpha.2 |
Mastodonのコミットハッシュ | 06803422da3794538cd9cd5c7ccd61a0694ef921 |
手順
DEVELOPMENT.md#dockerの手順通りにやると行ける。
docker compose -f .devcontainer/compose.yaml up -d
docker compose -f .devcontainer/compose.yaml exec app bin/setup
docker compose -f .devcontainer/compose.yaml exec app bin/dev
コンテナへのアタッチ方法
# 方法1
docker compose -f .devcontainer/compose.yaml exec app zsh
# 方法2
cd .devcontainer
docker compose exec app zsh
VSCodeがあるならDockerやRemoteほげほげ系の拡張を使い、devcontainer-appにAttach Shellしてもよい。
検証ユーザーの作成
- 次のコマンドでユーザーを作る
./bin/tootctl accounts create hoge --email hoge@example.com --confirmed
- ユーザーの承認を行い、必要に応じてパスワードを使いやすいものに変更する
rails console user = Account.find_by(username: 'hoge').user user.approve! # PW変更ここから user.password = 'password' user.skip_confirmation! # PW変更ここまで user.save! quit
フロントエンドのビルドとサーバー起動
bin/rails assets:precompile
bin/dev
トラブルシューティング
localhostではアクセスできるが、マシンのホスト名やhoge.testのようなローカルドメインでアクセスできない
.env.development
にALTERNATE_DOMAINS=hoge.test
の行を追加することで他のドメインでもアクセスできる。
この設定があるとMastodonを別環境で動かしててリモートからドメインアクセスする場合に便利。
ActiveRecord::PendingMigrationErrorなど、ActiveRecord関係のエラーが出る
コンテナの中でrails db:setup
を叩くことで解決する。
Unable to load application: NameError: uninitialized constant LetterOpenerWebというエラーが出る
リポジトリルートにあるdocker-compose.yml
を使うと発生するので、.devcontainer/compose.yaml
を使う事で解決する。
あとがき
検証用にバニラなMastodon環境が欲しくて作ってみたが昔と変わっていて地味にハマった…。
こんな感じにフォーカスが当たるとOS標準の枠が出て、矢印キーの左右で選択状態を切り替えられる<input type="radio" />
要素の作り方。
大まかには<label><input type="radio" /></label>
の構造にして、UI上はラベルを疑似要素的に表示し、ラジオボタン本体はUI上見えなくするが、display: none;
にせず、画面に残すことによってタブ遷移できるフォーカス可能要素として設計する内容。
サンプルコード
CSS
/* ラジオボタンを等間隔に整列し、左右に余計な空白を持たせない */
.radio-container {
display: flex;
column-gap: 0.25rem;
}
.hidden-radio {
/* チェックを消す */
appearance: none;
/* 非推奨要素を使っているが、iOS Safari対策 */
position: absolute;
clip: rect(0, 0, 0, 0);
pointer-events: none;
/* デフォルトマージンがチェックボックスの位置にあるので消す */
margin: 0;
}
.radio-label {
/* 文字列要素を綺麗に中央寄せする */
display: flex;
justify-content: center;
align-items: center;
/* 枠装飾、基本的にフォーカス枠が角丸であり、違和感がないようにborderも角丸にしておく */
padding: 5px;
border: 1px solid #60bce9;
border-radius: 4px;
/* 見かけ上ボタンなのでカーソルをボタン用にする */
cursor: pointer;
}
/* ラジオチェック時にラベルの背景色を変化させる */
.radio-label:has(.hidden-radio:checked) {
background-color: #60bce9;
}
/* ラジオフォーカス時にラベルのフォーカス枠を出す */
.radio-label:has(.hidden-radio:checked):focus-within {
outline: auto;
}
HTML
<form>
<div class="radio-container">
<label class="radio-label">
<input name="r2" type="radio" class="hidden-radio" value="1" checked />
<span>道明寺</span>
</label>
<label class="radio-label">
<input name="r2" type="radio" class="hidden-radio" value="2" />
<span>長命寺</span>
</label>
</div>
</form>
久々にPC構成を大刷新してから三ヶ月ほど経過しているが、ローカルLLMを叩いたときのパフォーマンスが前回と比べてどれほど上がるか計測してみた。
環境の現新比較
デバイス | 前回 | 今回 |
---|---|---|
CPU | Intel Core i7 13700 | Intel Core Ultra 7 265F |
GPU | GeForce RTX 4070 Ti | GeForce RTX 5070 Ti |
MEM | Crucial Ballistix BL2K16G32C16U4B(DDR4-3200 16GB) * 4 | Crucial CT2K16G56C46U5(DDR5-5600 16GB) * 4 |
M/B | ASUS TUF GAMING Z790-PLUS D4 | ASRock Z890 Pro RS |
ベンチマーク結果
前回はストップウォッチで計測していたが、今回はOpenWebUIのメタ情報から確認した。
gpt-oss:20b
指標 | 値 |
---|---|
response_token/s | 120.74 |
prompt_token/s | 255.92 |
total_duration | 22796593800 |
load_duration | 11155098300 |
prompt_eval_count | 73 |
prompt_tokens | 73 |
prompt_eval_duration | 285245200 |
eval_count | 1371 |
completion_tokens | 1371 |
eval_duration | 11355103800 |
approximate_total | 22s |
total_tokens | 1444 |
今回新規で追加。なんかこいつが標準っぽいので測ってみた。
gemma3:27b
指標 | 値 |
---|---|
response_token/s | 10.65 |
prompt_token/s | 39.72 |
total_duration | 85295369100 |
load_duration | 4291682600 |
prompt_eval_count | 13 |
prompt_tokens | 13 |
prompt_eval_duration | 327282600 |
eval_count | 859 |
completion_tokens | 859 |
eval_duration | 80674730800 |
approximate_total | 1m25s |
total_tokens | 872 |
前回は出力に3分半程度かかっていたが、今回は一分半程度と、良好な結果となった。
lucas2024/mistral-nemo-japanese-instruct-2408:q8_0
指標 | 値 |
---|---|
response_token/s | 51.88 |
prompt_token/s | 127.3 |
total_duration | 14512642900 |
load_duration | 2966192400 |
prompt_eval_count | 17 |
prompt_tokens | 17 |
prompt_eval_duration | 133547400 |
eval_count | 592 |
completion_tokens | 592 |
eval_duration | 11411474600 |
approximate_total | 14s |
total_tokens | 609 |
前回は出力に1分程度かかっていたが、今回は14秒程度と、非常に良好な結果となった。
qwen3:30b
指標 | 値 |
---|---|
response_token/s | 27.49 |
prompt_token/s | 57.74 |
total_duration | 134732866900 |
load_duration | 64763725000 |
prompt_eval_count | 14 |
prompt_tokens | 14 |
prompt_eval_duration | 242451700 |
eval_count | 1917 |
completion_tokens | 1917 |
eval_duration | 69724445400 |
approximate_total | 2m14s |
今回新規で追加。悪くない品質で、そこそこ早いのでこれは良さそうだ。
qwen3:32b
指標 | 値 |
---|---|
response_token/s | 5.66 |
prompt_token/s | 18.49 |
total_duration | 332234237600 |
load_duration | 9168679700 |
prompt_eval_count | 14 |
prompt_tokens | 14 |
prompt_eval_duration | 757307500 |
eval_count | 1823 |
completion_tokens | 1823 |
eval_duration | 322305287600 |
approximate_total | 5m32s |
total_tokens | 1837 |
今回新規で追加。流石に秒間5.66トークンは厳しい。
雑感
前回と比べるとかなり高速化されており、生成速度だけを見れば十分実用ラインに上がっていているように感じた。しかし回答の品質がそこまでよくなく、そのままでは使えないと感じた。恐らくRAGなどとして使えるようにカスタムしてやっと使えてくるみたいなところがあるのだろうか?
実用性で見ると、日本語文書作成ではgemma3:27bが一番よさそうに思えた。これはqwen3シリーズは単純な質問では結構いい感じなのだが、複雑な条件を付けると期待通りの結果を出してくれなかったからだ。lucas2024/mistral-nemo-japanese-instruct-2408:q8_0も、一見よさそうに見えるがよろしくない発言はできないように細工されているようで、微妙に感じた。
何はともあれ、現実的な速度でローカルLLMが動くようになったのはうれしい。
確認環境
NICはともに一つのみ。
- Windows 11 Pro 24H2
- Ubuntu 24.04.3 LTS
Windows
NICのIPv6アドレス(GUA)を取得する
コントロールパネルから取得
- コントロールパネル→ネットワークと共有センターを開く
- イーサネット→詳細を開く
- IPv6アドレスと書かれているのがGUA
コマンドプロンプトで取得
ipconfig
を叩き、「IPv6 アドレス」と書かれているものがGUA
Powershellで取得
(ipconfig | Select-String -Pattern "IPv6 アドレス(?: .)+: (.+)").Matches.Groups[1].Value
Ubuntu
# perl版
ip -6 addr | grep 'global dynamic' | perl -ale '$F[1] =~ /^([^\/]+)/; print $1;'
# awk版
ip -6 addr | grep 'global dynamic' | awk '{ split($2, a, "/"); print a[1] }'