技術約23分で読めます

参照画像1枚でキャラを保つSnapRef v1bをRef Adapter v2・Role-Ref-KVと同じ条件でM1 Maxに当てて比べる

いけさん目次

前回のAnima Ref Adapter v2とRole-Ref-KVを比べた記事を出す直前に、同じ用途のアダプターがもう1つ公開された。
SnapRefで、参照画像1枚からキャラクターの特徴を保ったまま、別の構図や場面を出すためのものだ。
READMEの比較表には、Ref Adapter v2やRole-Ref-KVより速く、v2より正解画像に近いという数字が載っている。

ただ、この数字はA100で計測したものだ。
前回と同じ8条件で当てると何が起きるのか、README独自の機能がMacのMPSでも同じように動くのかは、数字からは分からない。
そこで、前回の記事と同じ参照画像、プロンプト、シードでv1bを当て、M1 Max 64GBのComfyUIで確かめた。

SnapRefの概要

項目内容
作者Hugging Faceは0ppxnhximxr、GitHubはArcAnima
公開v1a・v1bとも2026年10月29日
中身ノード2個(SnapRef と SnapRef (Advanced))と、LoRA形式の重み
学習Animaで生成した58,300枚(scenes3x4)、10,000ステップ、Anima base v1.0
ライセンスノードはApache-2.0、重みはCircleStone Labs Non-Commercial License v1.2
入手先Hugging Face(v1b)、Hugging Face(v1a)、GitHub

仕組みはRef Adapter v2やRole-Ref-KVと同じ系統だ。
参照画像を専用の経路で1回だけモデルに通し、各ブロックの注目機構のkey/valueをキャッシュして、生成中の各ステップで読ませる。
ComfyUIのモデルにラッパーとして入るので、サンプラーは標準のものを選べる。

v1aとv1bの違いは次のとおり。

項目v1av1b
rank(参照側 / 生成側)128 / 64256 / 128
サイズ(bf16)381,822,008バイト910,324,208バイト
サイズ(FP8)194,652,728バイト460,246,968バイト
A100での1枚の時間(README)8.9秒9.9秒
正解画像とのDINOv2類似度(README)0.7220.720
プロンプトとのCLIP類似度(README)0.2490.256

READMEはv1bを「rankが2倍」と説明し、迷ったらv1aから始めるよう勧めている。
重みのキーを数えると、違いはrankだけではなかった。
LoRAのモジュールはv1aが336個、v1bが392個で、v1bは生成側のmlpにも当たっている。

READMEの比較表には、ほかのアダプターの値も載っている。

項目v1bv1aRef Adapter v2Role-Ref-KV参照なし
A100での1枚の時間9.9秒8.9秒14.4秒12.5秒7.7秒
正解画像とのDINOv2類似度0.7200.7220.675—0.493

正解画像は、同じキャラが指定のポーズをとった別の画像で、52例の平均だ。
配布されている scores_v1a_v1b.json で値を確かめると、参照画像そのものとのDINOv2類似度はv2が0.552、v1aが0.515、v1bが0.510で、順番が逆になる。
どちらの指標を見るかで、順位は変わる。

READMEの推奨設定。

項目内容
ベースモデルAnima base v1.0
サンプラーeuler か er_sde、simple、28〜30ステップ
cfg4.5
プロンプト品質タグ+1girl+solo+場面。髪や服、画風は参照から来るので書かない
解像度指定なし(ワークフローは832×1216)

検証環境

項目内容
マシンMacBook Pro M1 Max 64GB(MPS)
UIComfyUI v0.33.3
SnapRefHugging Faceのコミット 8e78def のノードと重み。sha256 は配布の SHA256SUMS と一致
解像度896×1152(前回と同じ)。節ごとに違う場合はその節に書く
サンプラーeuler / simple
シード20261027(シード比較の節は20261028・20261029、速度の節は20261030・20261031を追加)
参照画像前回と同じ。Ref Adapter v2の作例 ref_girl.jpg と、かなちゃんの立ち絵
前回の比較対象Ref Adapter v2とRole-Ref-KV。画像と数値は前回の記事から流用した。速度の節だけ同じ日に出し直した

ref_guidance_on はMPSでそのまま動かない。
Cannot convert a MPS Tensor to float64 dtype で止まるので、前回のRef Adapterと同じくAPG補正の .double() 2行を .float() にした。
それ以外のノードのコードは、黒画像の節で1回だけ試した変更を除いて元のままだ。

当てたモデルは前回と同じ8条件で、推奨設定はBaseの30ステップ・cfg 4.5に合わせた。

ラベルモデルステップ / cfg
Baseanima-base-v1.030 / 4.5
Aesthetic v1.1anima-aesthetic-v1.130 / 4.5
2.9B(付け替えあり)Anima-2.9B-preview-v130 / 4.5
2.9B(付け替えなし)Anima-2.9B-preview-v130 / 4.5
Turbo v1.1anima-turbo-v1.18 / 1.0
Turbo v1.0anima-turbo-v1.08 / 1.0
Base+Turbo LoRAanima-base-v1.0+anima-turbo-lora-v0.1(1.0)8 / 1.0
2.9B非公式Turboanima29b-p1-turbo1.18 / 1.0

2.9Bの付け替えは、40ブロックのうち差し込まれた12ブロックを避けるようにキーの番号を振り直すものだ。
ノードはキーのあるモジュールにだけLoRAを当てるので、Role-Ref-KVのときのようなゼロ埋めは要らなかった。

SnapRefの既定では、参照を読むのは正プロンプト側だけだ。
cfg 1.0のTurboなら1ステップのモデル呼び出しは1回で、cfg 4.5なら2回になる。

公式設定のまま動かしてみる

READMEのプロンプト、ワークフローのネガティブ、832×1216、28ステップ、cfg 4.5でBaseに当てた。

参照時間結果
かなちゃん289.9秒ベンチで脚を組む。夜の街。アホ毛、青いシュシュのサイドポニー、白シャツ、赤ネクタイ、黒タイツ、ローファーが残る
ref_girl276.7秒ベンチで脚を組む。ブロンドに赤メッシュ、ピンクの目、黒と白の服
かなちゃん
READMEのプロンプトでかなちゃんの立ち絵を参照し、夜のベンチで脚を組ませた結果
ref_girl
READMEのプロンプトでref_girlを参照し、夜のベンチで脚を組ませた結果
プロンプト
masterpiece, best quality, score_7, safe, 1girl, solo, full body, sitting, crossed legs, bench, street, night

ネガティブ

worst quality, low quality, score_1, score_2, score_3, artist name, blurry, jpeg artifacts, chromatic aberration

前回と同じ ref_girl のケーキの場面も、前回と同じ条件で出した。
結果は赤いソファ席でフォークを口に運ぶ絵で、髪色・メッシュ・服が残り、時間は302.6秒だった。

SnapRef v1b
SnapRef v1bをBaseに当て、ref_girlでケーキの場面を出した結果
Ref Adapter v2(前回)
Ref Adapter v2をBaseに当て、ref_girlでケーキの場面を出した結果
Role-Ref-KV(前回)
Role-Ref-KVをBaseに当て、ref_girlでケーキの場面を出した結果

Base・Aesthetic v1.1・2.9Bに当てた結果

以降の節は、特に書かない限り参照がかなちゃんの立ち絵で、ネガティブは前回と同じだ。

条件時間(走る / ケーキ)走るケーキ
Base312.0秒 / 316.1秒後ろ姿で走る。城と草原赤いソファ席でフォークを口に。参照どおり
Aesthetic v1.1316.0秒 / 315.9秒Baseとほぼ同じ構図の後ろ姿場面は同じ。参照どおり
2.9B(付け替えあり)441.4秒 / 445.6秒正面寄りで走る。参照どおりBaseとほぼ同じ構図
2.9B(付け替えなし)435.1秒 / 434.3秒参照の立ち姿のまま。背景はぼけ、人物の周りに白いもや同じく立ち姿のまま。カップとケーキだけ半透明で浮く
Base 走る
SnapRef v1bをBaseに当てた走る場面、後ろ姿
Base ケーキ
SnapRef v1bをBaseに当てたケーキの場面
Aesthetic v1.1 走る
SnapRef v1bをAesthetic v1.1に当てた走る場面、後ろ姿
Aesthetic v1.1 ケーキ
SnapRef v1bをAesthetic v1.1に当てたケーキの場面
2.9B(付け替えあり)走る
SnapRef v1bを付け替えて2.9Bに当てた走る場面
2.9B(付け替えあり)ケーキ
SnapRef v1bを付け替えて2.9Bに当てたケーキの場面
2.9B(付け替えなし)走る
SnapRef v1bを付け替えずに2.9Bに当てた走る場面、場面が反映されず立ち姿のまま
2.9B(付け替えなし)ケーキ
SnapRef v1bを付け替えずに2.9Bに当てたケーキの場面、場面が反映されず立ち姿のまま

ケーキの場面は3条件とも、アホ毛、画像右側のサイドポニー、白シャツ、赤ネクタイが参照どおりに出た。
前回のRole-Ref-KVでケーキの場面に出た、髪のオレンジ寄りはここでは出ていない。

2.9Bは付け替えなしだと動かない。
v2のように格子状に崩壊するのではなく、人物だけは参照の立ち姿のまま鮮明で、場面がほとんど反映されなかった。

走る場面のBaseとAestheticは後ろ姿になった。
プロンプトに向きの指定がないのでおかしな結果とは言えないが、前回のv2とRole-Ref-KVは同じシードで正面向きだったので、別の節で詳しく掘り下げた。

プロンプト

走る場面

masterpiece, best quality, score_7, newest, highres, absurdres, safe, 1girl, solo, full body, running, wind, hair blowing, dynamic pose, fantasy landscape, castle in background, sunset sky, dramatic clouds, grass field

ケーキの場面

masterpiece, best quality, score_7, newest, highres, absurdres, safe, 1girl, solo, upper body, sitting, eating, cake, cafe, indoors

ネガティブ

worst quality, low quality, score_1, score_2, score_3, blurry, jpeg artifacts, chromatic aberration, bad anatomy, bad hands, extra arms, extra fingers, missing fingers, text, watermark, signature, artist name, multiple views, split screen, comic, 2koma, 4koma

Turbo系に当てた結果

条件時間(走る / ケーキ)走るケーキ
Turbo v1.164.3秒 / 62.4秒正面で走る、右手を頭に。参照どおり窓際の赤いソファ席。腕でネクタイの大半が隠れる
Turbo v1.064.3秒 / 61.3秒正面で走る、腕を広げる。参照どおり片手を頬に。ネクタイの大半が隠れる
Base+Turbo LoRA63.3秒 / 62.3秒正面で走る、右手を握る。参照どおりTurbo v1.1に近い構図
2.9B非公式Turbo88.4秒 / 87.4秒Turbo v1.1とほぼ同じ構図Turbo v1.1とほぼ同じ構図
Turbo v1.1 走る
SnapRef v1bをTurbo v1.1に当てた走る場面
Turbo v1.1 ケーキ
SnapRef v1bをTurbo v1.1に当てたケーキの場面
Turbo v1.0 走る
SnapRef v1bをTurbo v1.0に当てた走る場面
Turbo v1.0 ケーキ
SnapRef v1bをTurbo v1.0に当てたケーキの場面
Base+Turbo LoRA 走る
SnapRef v1bをBase+Turbo LoRAに当てた走る場面
Base+Turbo LoRA ケーキ
SnapRef v1bをBase+Turbo LoRAに当てたケーキの場面
2.9B非公式Turbo 走る
SnapRef v1bを2.9B非公式Turboに当てた走る場面
2.9B非公式Turbo ケーキ
SnapRef v1bを2.9B非公式Turboに当てたケーキの場面

Turbo系は走る場面が4条件とも正面向きで、Baseの後ろ姿は出なかった。
READMEが対象にしているのはAnima base v1.0だが、Turboのフルモデル、Turbo LoRA、付け替えた2.9Bのどれでも問題なく動いた。
ケーキの場面で赤ネクタイが腕に隠れるのは構図によるもので、次の節の設定では見えている。

ref_guidance 4.5で4コマに崩れるか

前々回のpilotは、Turbo系をcfg 1.0・ref_guidance 4.5で回すと4コマに崩れた。
前回のv2は4コマにならなかったが、色がくすんだ。
SnapRefにも ref_guidance_on があるので、同じ設定でケーキの場面を出した。

条件時間結果
Turbo v1.198.5秒1枚絵。ネクタイが見える。色はくすまない
Turbo v1.096.5秒1枚絵。ネクタイが見える。色はくすまない
Base+Turbo LoRA96.5秒1枚絵。シャツの胸元が白く飛び気味
2.9B非公式Turbo138.8秒1枚絵。シャツの胸元が白く飛び気味
Turbo v1.1
SnapRef v1bをTurbo v1.1にcfg 1.0、ref_guidance 4.5で当てたケーキの場面
Turbo v1.0
SnapRef v1bをTurbo v1.0にcfg 1.0、ref_guidance 4.5で当てたケーキの場面
Base+Turbo LoRA
SnapRef v1bをBase+Turbo LoRAにcfg 1.0、ref_guidance 4.5で当てたケーキの場面
2.9B非公式Turbo
SnapRef v1bを2.9B非公式Turboにcfg 1.0、ref_guidance 4.5で当てたケーキの場面

4条件とも4コマには分かれなかった。
1ステップのモデル呼び出しが2回になるので時間は1.5倍ほどかかるが、シード1つでは効果と揺れを区別できない。

Baseでも ref_guidance_on を試した。
READMEは6〜8で参照に近づくと書き、時間は約1.4倍、ref_end 0.6なら速くて結果はほぼ同じとしている。

条件時間結果
オフ(既定)316.1秒ネクタイが見える。髪は明るい茶
ref_guidance 4.5480.8秒構図がやや変わる。色はくすまない
ref_guidance 7480.7秒色はくすまない。ネクタイが見える
ref_guidance 7、ref_end 0.6432.2秒ref_guidance 7とほぼ同じ絵
Turbo v1.1、ref_guidance 2(参考)96.0秒1枚絵。ネクタイが見える
ref_guidance 4.5
BaseでSnapRef v1bのref_guidance 4.5を使ったケーキの場面
ref_guidance 7
BaseでSnapRef v1bのref_guidance 7を使ったケーキの場面
ref_guidance 7、ref_end 0.6
BaseでSnapRef v1bのref_guidance 7、ref_end 0.6を使ったケーキの場面
Turbo v1.1、ref_guidance 2
Turbo v1.1でSnapRef v1bのref_guidance 2を使ったケーキの場面

手元の時間はオフの約1.5倍で、ref_end 0.6でも1.4倍弱だった。
ref_end 0.6の絵がほぼ同じという点は、READMEのとおりだった。

寝そべり・俯瞰構図を試す

条件時間結果
Turbo v1.160.5秒白い花の草地で仰向け、膝を立てる。頭は画面の上。ローファー
Base316.0秒黄色と白の花の草地で仰向け、膝を立てる。頭は画面の上。ローファー
Turbo v1.1
SnapRef v1bをTurbo v1.1に当て、草地に仰向けで寝そべる構図を真上から出した結果
Base
SnapRef v1bをBaseに当て、草地に仰向けで寝そべる構図を真上から出した結果

正面の立ち絵1枚から、キャラを保ったまま仰向け・俯瞰に変わった。

プロンプト
masterpiece, best quality, score_7, newest, highres, absurdres, safe, 1girl, solo, full body, lying on back, on grass, from above, looking at viewer, flowers, daytime

シードを変えて走る場面を出す

前回と同じくシード20261028・20261029を足し、Turbo系4条件と、Base・2.9B(付け替えあり)で出した。

条件s20261027s20261028s20261029
Turbo v1.1正面正面正面
Turbo v1.0正面正面正面
Base+Turbo LoRA正面正面正面
2.9B非公式Turbo正面正面正面
Base後ろ姿後ろ姿、人物が小さい後ろ姿
2.9B 付け替えあり正面後ろ姿、人物が小さい正面
Turbo v1.1 s20261027
SnapRef v1bをTurbo v1.1に当てた走る場面、seed 20261027
Turbo v1.1 s20261028
SnapRef v1bをTurbo v1.1に当てた走る場面、seed 20261028
Turbo v1.1 s20261029
SnapRef v1bをTurbo v1.1に当てた走る場面、seed 20261029
Turbo v1.0 s20261027
SnapRef v1bをTurbo v1.0に当てた走る場面、seed 20261027
Turbo v1.0 s20261028
SnapRef v1bをTurbo v1.0に当てた走る場面、seed 20261028
Turbo v1.0 s20261029
SnapRef v1bをTurbo v1.0に当てた走る場面、seed 20261029
Base+Turbo LoRA s20261027
SnapRef v1bをBase+Turbo LoRAに当てた走る場面、seed 20261027
Base+Turbo LoRA s20261028
SnapRef v1bをBase+Turbo LoRAに当てた走る場面、seed 20261028
Base+Turbo LoRA s20261029
SnapRef v1bをBase+Turbo LoRAに当てた走る場面、seed 20261029
2.9B非公式Turbo s20261027
SnapRef v1bを2.9B非公式Turboに当てた走る場面、seed 20261027
2.9B非公式Turbo s20261028
SnapRef v1bを2.9B非公式Turboに当てた走る場面、seed 20261028
2.9B非公式Turbo s20261029
SnapRef v1bを2.9B非公式Turboに当てた走る場面、seed 20261029
Base s20261027
SnapRef v1bをBaseに当てた走る場面、seed 20261027
Base s20261028
SnapRef v1bをBaseに当てた走る場面、seed 20261028
Base s20261029
SnapRef v1bをBaseに当てた走る場面、seed 20261029
2.9B 付け替えあり s20261027
SnapRef v1bを付け替えて2.9Bに当てた走る場面、seed 20261027
2.9B 付け替えあり s20261028
SnapRef v1bを付け替えて2.9Bに当てた走る場面、seed 20261028
2.9B 付け替えあり s20261029
SnapRef v1bを付け替えて2.9Bに当てた走る場面、seed 20261029

18枚とも、見える範囲で髪型と服は参照のままだった。
正面の14枚はサイドポニー、白シャツ、赤ネクタイ、黒タイツがそろい、後ろ姿の4枚もシュシュのサイドポニーとタイツが残っている。
前回のRole-Ref-KVにあった、ポニーやネクタイが消えるシードはなかった。
一方でBaseは3シードとも後ろ姿で、前回のv2とRole-Ref-KVは同じ3シードすべて正面向きだった。

Baseの走る場面が後ろ姿になる

後ろ姿がv1bの癖なのかBaseの癖なのかを切り分けるため、シードと条件を足した。

条件s20261027s20261028s20261029s20261030s20261031
v1b後ろ姿後ろ姿後ろ姿後ろ姿後ろ姿
v1a正面後ろ姿正面正面—
v1b FP8後ろ姿————
参照なし———後ろ姿後ろ姿
Ref Adapter v2正面正面正面正面—
Role-Ref-KV正面正面正面正面—
参照なし s20261030
参照なしのBaseで走る場面、後ろ姿
v1b s20261030
SnapRef v1bをBaseに当てた走る場面、後ろ姿
v1a s20261030
SnapRef v1aをBaseに当てた走る場面、正面
Ref Adapter v2 s20261030
Ref Adapter v2をBaseに当てた走る場面、正面
Role-Ref-KV s20261030
Role-Ref-KVをBaseに当てた走る場面、正面
参照なし s20261031
参照なしのBaseで走る場面、後ろ姿

参照なしのBaseも2シードとも後ろ姿なので、このプロンプトで後ろ向きになるのはBase自体の傾向と思われる。
参照の正面の立ち絵に引っ張られるv2やRole-Ref-KVと違って、v1bはそれを変えなかったことになる。
READMEの「参照を構図としてコピーせず見た目として読む」という説明とは合っているが、シード数は少ない。

参照の効きを強めても、向きは変わらなかった。
プロンプトに looking at viewer を足すと正面になった。

条件(s20261027)時間結果
strength 1293.9秒後ろ姿
ref_guidance 7481.6秒後ろ姿
looking at viewer を追加316.0秒正面
strength 1
strength 1でも後ろ姿のまま
ref_guidance 7
ref_guidance 7でも後ろ姿のまま
looking at viewer を追加
looking at viewerを足すと正面になる

v1a・v1b・FP8を比べる

条件v1bv1av1b FP8
Turbo v1.1 走る s20261027参照どおり参照どおりv1bとほぼ同じ絵
Turbo v1.1 走る s20261028参照どおり半袖、黒タイツがニーハイに変わる—
Turbo v1.1 走る s20261029参照どおり片脚がハイソックスのように見える—
Turbo v1.1 ケーキネクタイが腕に隠れるネクタイが見える。胸ポケットが増えるv1bとほぼ同じ絵
Base 走る s20261027後ろ姿正面、参照どおり後ろ姿、v1bとほぼ同じ
Base ケーキ参照どおり参照どおり。カップが2つv1bとほぼ同じ絵
v1b Turbo v1.1 走る
SnapRef v1bをTurbo v1.1に当てた走る場面
v1a Turbo v1.1 走る
SnapRef v1aをTurbo v1.1に当てた走る場面
v1b FP8 Turbo v1.1 走る
SnapRef v1b FP8をTurbo v1.1に当てた走る場面
v1b s20261028
SnapRef v1bをTurbo v1.1に当てた走る場面、seed 20261028
v1a s20261028
SnapRef v1aをTurbo v1.1に当てた走る場面、半袖でニーハイに変わる
v1a s20261029
SnapRef v1aをTurbo v1.1に当てた走る場面、seed 20261029
v1b Turbo v1.1 ケーキ
SnapRef v1bをTurbo v1.1に当てたケーキの場面
v1a Turbo v1.1 ケーキ
SnapRef v1aをTurbo v1.1に当てたケーキの場面
v1b FP8 Turbo v1.1 ケーキ
SnapRef v1b FP8をTurbo v1.1に当てたケーキの場面
v1b Base 走る
SnapRef v1bをBaseに当てた走る場面
v1a Base 走る
SnapRef v1aをBaseに当てた走る場面
v1b FP8 Base 走る
SnapRef v1b FP8をBaseに当てた走る場面

Turbo v1.1の走る場面3シードでは、v1aの服の崩れが2回で、v1bは0回だった。
READMEの正解画像との類似度はほぼ同じだが、少なくともこの参照とシードでは、v1bのほうが服を保った。

FP8はサイズが約半分で、READMEの「実質的に同じ画像」のとおりだった。
同じシードのbf16との差は、0〜255の画素値の平均で1.8〜3.0だ。
構図は変わらず、並べて見て細部が少し違う程度だった。
時間は56.5〜58.6秒(Turbo)、312秒台(Base)で、bf16と変わらない。
--bf16-unet で起動しているので、FP8の重みをどの精度で計算しているかまでは見ていない。

strengthの効き方

Advancedノードの strength は対数スケールで、参照のkeyの重みを変える。
ツールチップには、+1で約2.7倍、-1で約2.7分の1とある。
READMEは細部(飾り、袖、アクセサリ)を増やしたいときに1〜2を勧めている。

strengthTurbo v1.1 走るTurbo v1.1 ケーキBase ケーキ
-1笑顔で脚を大きく上げる。ネクタイ、タイツは残る手を頬に。シュシュが暗い色に髪がオレンジ寄り
0(既定)手を頭に。走る動きが大きいフォークを口に。ネクタイは腕の陰髪は明るい茶
1腕を下ろし、表情が硬い。動きが小さいネクタイが見え始める彩度がやや下がる
21より立ち姿に近い正面向きで背筋を伸ばす。ネクタイ全体が見える彩度が下がり灰色がかる。アホ毛が上で切れる。背景にビル
Turbo 走る -1
strength -1のTurbo v1.1の走る場面
Turbo 走る 0
strength 0のTurbo v1.1の走る場面
Turbo 走る 1
strength 1のTurbo v1.1の走る場面
Turbo 走る 2
strength 2のTurbo v1.1の走る場面
Turbo ケーキ -1
strength -1のTurbo v1.1のケーキの場面
Turbo ケーキ 0
strength 0のTurbo v1.1のケーキの場面
Turbo ケーキ 1
strength 1のTurbo v1.1のケーキの場面
Turbo ケーキ 2
strength 2のTurbo v1.1のケーキの場面
Base ケーキ -1
strength -1のBaseのケーキの場面
Base ケーキ 0
strength 0のBaseのケーキの場面
Base ケーキ 1
strength 1のBaseのケーキの場面
Base ケーキ 2
strength 2のBaseのケーキの場面

上げるほど、ポーズが参照の立ち姿に寄り、走る動きや表情が小さくなった。
Baseの2は色も薄くなる。
かなちゃんの立ち絵には細かい飾りがないので、READMEの言う細部が増えるかどうかはこの参照では確かめられなかった。

strength は時間を増やさなかった。
Turbo v1.1のケーキが56.5秒、走る場面が45.4〜45.5秒、Baseのケーキが301.8〜302.0秒で、0のときと差がない。
READMEには「strengthと重みは遅くならなくなった」とあり、ツールチップには古い「約1.3倍遅い」が残っている。
MPSでは高速な計算経路を使えず、マスク付きの経路を通るが、それでも遅くならなかった。

なお、簡単なほうの SnapRef ノードの strength はスケールが違う。
こちらは1が学習どおり、0がオフ、2が2倍で、対数ではない。
SnapRef の1.0とAdvancedの0は、ピクセル単位で同じ画像になった。
READMEの「1〜2を試す」はAdvancedの値で、SnapRef の2はAdvancedの約0.7に当たる。

fidelityはMacでは切り替えスイッチになる

fidelity は下げるほどプロンプトに自由に従う設定で、ノードのコードを読むとCUDAとそれ以外で動きが違う。
CUDAでは負プロンプト側に参照を 1 - fidelity の重みで読ませるが、高速な計算経路が必要だ。
それ以外では、1未満ならどの値でも負プロンプト側が参照を完全に読む、というフォールバックになっている。

実際にBaseのケーキの場面で比べた。

条件時間結果
fidelity 1.0(既定)316.1秒髪は明るい茶
fidelity 0.5354.5秒髪が濃いオレンジ寄り。シュシュが紫がかる
fidelity 0.0346.5秒fidelity 0.5とピクセル単位で同じ
ref_in_uncond オン347.4秒fidelity 0.5とピクセル単位で同じ
Turbo v1.1、fidelity 0.560.6秒fidelity 1.0とピクセル単位で同じ
fidelity 1.0
fidelity 1.0のBaseのケーキの場面
fidelity 0.5(0.0・ref_in_uncondも同じ画像)
fidelity 0.5のBaseのケーキの場面、髪がオレンジ寄り

コードのとおり、Macでは0.5でも0.0でも ref_in_uncond と同じ画像になり、途中の値は作れない。
cfg 1のTurboは負プロンプト側を計算しないので、何も変わらなかった。

modeのcharで画風を変える

mode の cs は既定でキャラと画風の両方を参照から取り、char はキャラだけを取る。
READMEは char と絵師タグの組み合わせを挙げている。
ここでは絵師タグは使わず、一般的な画風のタグで試した。

条件cschar
Base、タグなし既定と同じ画像髪のつやと線が少し変わる
Base、watercolor (medium)ほぼ変わらない水彩にならず、髪が鮮やかなオレンジ、窓枠が黄色に
Base、1990s (style), retro artstyleほぼ変わらない髪が濃い茶、線が太く、古いアニメ寄り
Turbo v1.1、watercolor (medium)ほぼ変わらない水彩にならず、光の表現が増える程度
Base watercolor cs
mode csでwatercolorを指定したBaseのケーキの場面
Base watercolor char
mode charでwatercolorを指定したBaseのケーキの場面、髪が鮮やかなオレンジ
Base 1990s cs
mode csで1990s styleを指定したBaseのケーキの場面
Base 1990s char
mode charで1990s styleを指定したBaseのケーキの場面、髪が濃い茶で線が太い

cs ではタグを足しても画風はほとんど変わらなかった。
char では変わるが、watercolor は水彩にならず、キャラの髪色まで変わった。
READMEのWhat’s nextには、次のv2aで mode char を強化するとある。

2キャラを1枚の参照で出す

READMEのやり方どおり、2人の立ち絵を横に並べた1枚を参照にして、1216×832で出した。

参照(1664×1216)
かなちゃんと金髪のキャラの立ち絵を横に並べた参照画像
条件時間左(かなちゃん)右(金髪)
Turbo v1.1 s2026102757.6秒ネクタイがリボンに。スカートが格子柄に参照どおり
Turbo v1.1 s2026102848.5秒ネクタイがリボンに参照どおり
Turbo v1.1 s2026102948.5秒ネクタイがリボンに参照どおり
Base s20261027314.1秒ネクタイは残る。スカートが格子柄にサイドポニーが付く
Base s20261028303.0秒ネクタイがリボンにサイドポニーが付く
Turbo v1.1 s20261027
2キャラの参照でTurbo v1.1に当てた結果、seed 20261027
Turbo v1.1 s20261028
2キャラの参照でTurbo v1.1に当てた結果、seed 20261028
Turbo v1.1 s20261029
2キャラの参照でTurbo v1.1に当てた結果、seed 20261029
Base s20261027
2キャラの参照でBaseに当てた結果、seed 20261027
Base s20261028
2キャラの参照でBaseに当てた結果、seed 20261028

5枚とも2人とも出て、左右も髪の色も入れ替わらず、黒タイツと白ソックスの違いも保った。
ただ、かなちゃんのネクタイは5枚中4枚で右のキャラと同じリボンになった。
Baseでは右のキャラにも、左のキャラのサイドポニーが付いてしまった。
READMEは「参照からはっきり見えない属性が2人の間で混ざることがある」としている。
今回はネクタイやスカートのように、参照にはっきり描かれている部分でも混ざった。

プロンプト
masterpiece, best quality, score_7, newest, highres, absurdres, safe, 2girls, brown hair girl on the left, blonde girl on the right, standing side by side, full body, looking at viewer, park, day

横に並べた参照でstrengthを動かすと黒画像になる

混ざりを減らそうと strength 2にすると、真っ黒な画像が出た。
シードを変えても、Baseにしても、strengthを1や-1にしても同じだった。
一方で、同じ参照でもstrength 0なら正常に出る。

条件を絞っていくと、キャラが2人かどうかは関係なく、参照の大きさで決まっていた。
ノードは参照を約1MP以下、16の倍数に縮小する。
1664×1216は1184×864になる。
かなちゃん1人を余白付きで同じ大きさにした画像でも黒くなり、ほかのサイズでは出なかった。

参照のサイズ出力のサイズトークン数(参照+出力)16の倍数かstrength 1以上
832×1216896×11523,952+4,032=7,984はい正常
1216×832896×11523,952+4,032=7,984はい正常
1024×1024896×11524,096+4,032=8,128はい正常
832×640896×11522,080+4,032=6,112はい正常
640×832896×11522,080+4,032=6,112はい正常
832×12161216×8323,952+3,952=7,904はい正常
1184×864896×11523,996+4,032=8,028いいえ黒
864×1184896×11523,996+4,032=8,028いいえ黒
1184×8641216×8323,996+3,952=7,948いいえ黒

16ピクセルが1トークンに当たる。
MPSが通る _masked_attention は、キーの数を16の倍数にそろえるために端を埋め、その部分のマスクを float("-inf") にしている。
strengthが0ならこの経路を通らないので、黒くならない。
この1行を -1e4 に変えて同じ条件(1184×864の参照、strength 2、シード20261027)で出すと、黒画像は出なかった。
この1枚は上下に白い帯が入ったが、ネクタイ、リボン、無地と格子柄のスカートが2人とも参照どおりだった。
ただ、同じ大きさの乱数テンソルをPyTorchの注目機構だけに通しても NaN は再現しなかったため、黒くなる直接の要因までは特定できていない。
修正は1回試したあと元に戻している。

マスクを -1e4 に変えたノード、strength 2
マスクの値を変えたノードで、横に並べた参照とstrength 2で出した結果、2人とも服が参照どおりで上下に白い帯が入る

ノードを変えずに避けるなら、合計が16の倍数になるサイズに参照を合わせればよい。
2人の参照を余白を足して1216×832にすると、strength 1でも2でも出た。

条件時間左(かなちゃん)右(金髪)
strength 056.5秒ネクタイがリボンに。スカートが格子柄に参照どおり
strength 147.5秒ネクタイが残る参照どおり
strength 247.4秒細いネクタイサイドポニーが付く。足元が白く抜ける
strength 2、s2026102844.4秒ネクタイがリボンにサイドポニーが付く
strength 0
参照を1216×832に合わせたstrength 0の結果
strength 1
参照を1216×832に合わせたstrength 1の結果、ネクタイが残る
strength 2
参照を1216×832に合わせたstrength 2の結果、足元が白く抜ける
strength 2、s20261028
参照を1216×832に合わせたstrength 2、seed 20261028の結果

ネクタイが残ったのはstrength 1の1枚で、2では戻っているので、混ざりを安定して防げるとは言えない。
READMEにある黒画像の項目はfp16が原因のもので、これとは別だ。
CUDAは別の経路を通るので、この黒画像はMPSなどでfused kernelが使えない環境で起きる挙動とみられる。
SnapRef ノードのstrengthを1以外にしたときや、複数参照の weight を変えたときも同じ経路を通るので、サイズによっては同じことが起きると思われる。

同じキャラの参照を複数入れる

11月1日のノード更新で、同じキャラの参照を最大3枚入れられるようになった。
READMEの例は、上半身の画像に全身の画像を足す使い方だ。
かなちゃんの上半身の画像を足して試した。
この上半身の画像はブレザーにリボンで、全身の立ち絵の白シャツにネクタイとは服が違う。
どちらの情報が使われるかが見分けやすい。

上半身の参照
かなちゃんの上半身の画像、ブレザーとリボン
全身の参照
かなちゃんの全身の立ち絵、白シャツとネクタイ
条件(Turbo v1.1)走る時間ケーキ時間
上半身だけブレザーとリボン。下は格子柄のスカートと素足に片方だけの靴下で、参照にない53.5秒ブレザーとリボン53.6秒
上半身+全身(separate)ブレザーとリボン。下は無地のスカート、黒タイツ、ローファー69.7秒ブレザーとリボン69.7秒
上半身+全身(stitch)ブレザーとリボン。下は無地のスカート、黒タイツ、ローファー57.5秒ブレザーとリボン57.6秒
上半身の weight 0.4白シャツとネクタイ64.7秒——
全身の weight 0.4——ブレザーとリボン63.7秒
全身を1枚目、上半身を2枚目——ブレザーとリボン69.6秒
上半身だけ
上半身の参照だけで走る場面、下半身は参照にない服
separate
上半身と全身の参照をseparateで入れた走る場面
stitch
上半身と全身の参照をstitchで入れた走る場面
上半身の weight 0.4
上半身のweightを0.4にした走る場面、白シャツとネクタイになる
上半身だけ ケーキ
上半身の参照だけでケーキの場面
separate ケーキ
上半身と全身の参照をseparateで入れたケーキの場面
全身の weight 0.4 ケーキ
全身のweightを0.4にしたケーキの場面
全身を1枚目 ケーキ
全身の参照を1枚目にしたケーキの場面、ブレザーのまま

全身の参照を足すと、上半身だけでは参照にない服になっていた下半身が、全身の参照どおりになった。
READMEの使い方が効いている。
どの組み合わせも1人だけが出て、2人に分かれることはなかった。

服が違う2枚を混ぜると、走る場面もケーキの場面も、重みが同じなら上半身の画像のブレザーが勝った。
入れる順番を入れ替えても同じで、上半身の画像を0.4に下げて初めて全身の服になった。
画面の大きな割合を占めるほうが強く反映される可能性がある。
Baseの separate は350.4秒で、1枚のときより約40秒長い。

3Dポーズと組み合わせる

前回は、CharRef-LLLiteを介さないとRef AdapterとLLLiteを組み合わせられないことを確かめた。
SnapRefは参照のkey/valueを別に持ち、生成側の計算には参照のトークンが混ざらないので、標準のノードで動くかもしれない。
ComfyUI標準の AnimaLLLiteApply と、CharRef-LLLiteの ExperimentalAnimaLLLiteRefApply で比べた。
ポーズの入力は前回と同じ 3dpose_example.png、768×1152、LLLiteの強さは1.0だ。

条件s20261027s20261028s20261029
標準のLLLite+SnapRef座って片膝を上げ、手を床に。靴なし白い台に腰掛ける。ローファー木の座面の台に腰掛ける。ローファー
CharRef-LLLite+SnapRef標準とピクセル単位で同じ標準とピクセル単位で同じ標準とピクセル単位で同じ
ポーズ画像
toyxyzのサンプルの3Dポーズ画像
SnapRefの参照だけ
SnapRefの参照だけで出した結果、膝を立てて座る
標準のLLLite s20261027
標準のLLLiteとSnapRefで出した結果、seed 20261027、靴がない
標準のLLLite s20261028
標準のLLLiteとSnapRefで出した結果、seed 20261028
標準のLLLite s20261029
標準のLLLiteとSnapRefで出した結果、seed 20261029
標準のLLLite Base
Baseで標準のLLLiteとSnapRefを使った結果

標準のノードだけでポーズどおりに座り、CharRef-LLLiteのノードと3シードともピクセル単位で一致した。
SnapRefでは接続用のノードを足さなくてよい。
Turboの時間は45.3〜45.4秒で、前回のv2との組み合わせの86.4秒より短かった。
Base(30ステップ、cfg 4.5)も272.5秒でポーズどおり、ローファーも出た。
靴が消えたのはTurboのs20261027の1枚で、前回のv2でも同じシードで靴が消えている。

プロンプト
masterpiece, best quality, score_7, newest, highres, absurdres, safe, 1girl, solo, full body, sitting, looking at viewer, simple background

READMEの既知の制限を試す

READMEには、場面が服を上書きする例として beach で水着になること、屋外の全身で足元が白い床になり、地面を書くと直ることが挙げられている。

条件時間結果
beach Base313.1秒水着にならない。シャツが半袖に変わる。足元の砂は白く平ら
beach Base、strength 2293.8秒長袖に戻る。全体に色が薄い
beach Turbo v1.160.6秒水着にならない。長袖のまま。砂浜の描き込みがある
beach Turbo v1.1、strength 248.5秒水着にならない。長袖のまま
outdoors Base314.1秒海辺のような背景。足元は明るく平らな地面
outdoors, grass Base305.0秒白い背景の中で、足元だけに丸く草が生える
beach Base
beachを指定したBaseの結果、水着にならず半袖
beach Base strength 2
beachを指定したBaseのstrength 2の結果、長袖で色が薄い
beach Turbo v1.1
beachを指定したTurbo v1.1の結果
beach Turbo v1.1 strength 2
beachを指定したTurbo v1.1のstrength 2の結果
outdoors Base
outdoorsを指定したBaseの結果
outdoors, grass Base
outdoorsとgrassを指定したBaseの結果、足元にだけ丸く草が生える

シードは1つだが、水着は4枚とも出なかった。
Baseでシャツが半袖に変わったのが、服の上書きに当たる。
grass を足すと、足元だけ草の島のようになり、地面としては描かれなかった。
READMEの「地面を書けば直る」は、この1枚では当てはまらなかった。

小さな細部の簡略化や、肌の濃い参照が明るくなる制限の確認は、手元に合う参照がないため割愛した。

プロンプト

beach の場面

masterpiece, best quality, score_7, newest, highres, absurdres, safe, 1girl, solo, full body, standing, beach, ocean, day

outdoors の場面

masterpiece, best quality, score_7, newest, highres, absurdres, safe, 1girl, solo, full body, standing, looking at viewer, outdoors, day

生成速度の実測

M1 Max 64GBで、896×1152を1枚出す時間。
同じ日に、走る場面でシードを変えながら続けて出した。

条件Turbo v1.1(8ステップ、cfg 1)Base(30ステップ、cfg 4.5)
参照なし38.4〜42.4秒259.5〜263.6秒
SnapRef v1b51.5〜56.5秒307.9〜312.1秒
SnapRef v1a50.5〜55.6秒298.0秒
Ref Adapter v256.6〜57.5秒(ref_guidance 1.0)475.4秒(ref_guidance 4.5)
Role-Ref-KV91.9〜92.0秒(8ステップ)297.9秒(28ステップ)

それ以外の条件は次のとおり。

条件時間
SnapRef v1b、Base・Aesthetic(全シード)293.9〜316.1秒
SnapRef v1b、2.9B 付け替えあり438.2〜445.6秒
SnapRef v1b、Turbo系3条件49.4〜64.3秒
SnapRef v1b、2.9B非公式Turbo82.6〜88.7秒
Turbo系3条件、ref_guidance 4.596.5〜98.5秒
2.9B非公式Turbo、ref_guidance 4.5138.8秒

Baseでの参照の追加分は約50秒で、参照なしの約1.2倍だった。
READMEのA100の値は約1.3倍(9.9秒と7.7秒)で、近い。
Baseのv1bはv2の約3分の2の時間で、これはREADMEの比(9.9秒と14.4秒)とも合う。

Role-Ref-KVは推奨の28ステップなので、総時間はv1bと同じくらいになった。
1ステップあたりではv1bが約10.3秒、Role-Ref-KVが約10.6秒でほぼ差がない。
READMEのA100ではv1bが9.9秒、Role-Ref-KVが12.5秒なので、Macではこの差はあまり出ていない。
Turboでは、Role-Ref-KVがcfg 1でも毎ステップ2回計算するので、v1bが約1.7倍速かった。
v2とはほぼ同じだ。

v1aとv1bの差は、Turboでは1秒ほどで、シードによるブレの範囲だった。
Baseでも298.0〜308.3秒と、v1bの約1〜5%短い程度だった。

試していないもの

  • READMEが修正済みとするfp16での黒画像。--bf16-unet で起動しているので再現条件を通らない
  • Anzhc・sorryhyunのMod Guidance、Spectrumとの組み合わせ
  • FP8のAnima base
  • ref_caption、use_batch、correction の rescale、ref_megapixels の変更
  • CUDAでの動作全般(fidelityの途中の値、黒画像の条件を含む)
  • 実写寄りの参照、肌の濃い参照、細かい飾りの多い参照
  • メモリ使用量の比較

シードは条件ごとに1〜5個で、かなちゃんと ref_girl の2枚の参照に偏っている。
「出なかった」は、この範囲で出なかったという意味だ。

使い分け

用途選ぶもの
Baseの推奨設定で出すSnapRef v1b。v2より速く、3シードで髪型と服が参照から変わらなかった。走る場面などは向きをプロンプトで指定する
Turbo系で速く出すSnapRef v1bかRef Adapter v2(ref_guidance 1.0)。時間はほぼ同じ。Role-Ref-KVより約1.7倍速い
容量を抑えるSnapRef v1b FP8(460MB)。bf16と構図が変わらなかった
v1aとv1bで迷う手元の範囲では服を保ったのはv1b。小さいほうがよければv1a
3Dポーズと組み合わせるSnapRef+標準のLLLite。接続用のノードが要らない
上半身と全身の参照を両方使うSnapRefの image_2。下半身の服まで参照どおりになった
2キャラSnapRef v1bで出せるが、ネクタイや髪型が混ざる。Macで strength や weight を使うなら参照のサイズに注意
2.9B系SnapRefは付け替えるだけで動く。ゼロ埋めは要らない

参考リンク