Pythonと[FLUX.1-dev]でローカル環境に生成AIをインストールした時の手順を備忘録的に投稿しておきます。
ローカル環境に生成AIをインストール
先回インストールしてみた[FLUX.1-dev]でプロンプトに入力したテキストから画像を生成するまでのワークフローを作成してみた。
[FLUX.1-dev]をインストールする手順については別記事をご覧ください。
今回のワークフローのベースになっている、ワークフローの作成手順については別記事をご覧ください。
ガイダーを利用したワークフロー
先回作成したワークフローは[CLIPテキストエンコード(プロンプト)]に入力したでテキストを[カスタムサンプラー]に直接受け渡していました。
今回は[基本ガイダー]を利用しての処理に改良してみます。
ガイダーとは[ComfyUI]のドキュメントによると、こんな説明になっています。
BasicGuiderノードは、サンプリングプロセス用のシンプルなガイダンスメカニズムを作成します。モデルとコンディショニングデータを入力として受け取り、サンプリング中に生成プロセスをガイドするために使用できるガイダーオブジェクトを生成します。このノードは、制御された生成に必要な基本的なガイダンス機能を提供します。
要するに作成されたモデルデータとテキスト(プロンプト)からサンプラーの生成に必要なガイドを作成する役割です。
今回利用した[基本ガイダー]ノードは[モデル]と[条件付け(コンディショニング)]の2つの入力なのでネガティブプロンプトの用意が必要なくなります。
実際に配置するノードは、こんな感じ。(名前を[ノードライブラリ]で検索すると表示されます)
| 名前 | 数量 |
| デュアルCLIPを読み込む | 1 |
| CLIPテキストエンコード(プロンプト) | 1 |
| 拡散モデルを読み込む | 1 |
| 整数 | 2 |
| モデルサンプリングフラックス | 1 |
| 空のSD3潜在画像 | 1 |
| 基本スケジューラー | 1 |
| 基本ガイダー | 1 |
| ランダムノイズ | 1 |
| Kサンプラー選択 | 1 |
| カスタムサンプラー(高度) | 1 |
| VEAを読み込む | 1 |
| VEAデコード | 1 |
| 画像を保存 | 1 |
最初にプロンプトを作成するワークフロー
1.[デュアルCLIPを読み込む]ノードを配置して[clip_name]に[clip_l.safetensors]と[t5xxl_fp8_e4m3fn.safetensors]を設定します。
2.[CLIPテキストエンコード(プロンプト)]ノードを配置して[デュアルCLIPを読み込む]ノードの[CLIP(クリップ)]ピンを接続します。
3. [CLIPテキストエンコード(プロンプト)]ノードのボックスにテキストを入力します。
今回はキーワードとして “Green Apple” を入力しました。
モデルを作成するワークフロー
1.[拡散モデルを読み込む]ノードを配置して[unet_name]プロパティに[flux1-dev.safetensors]を設定します。
2.[モデルサンプリングフラックス]ノードを配置して[拡散モデルを読み込む]の[モデル]ピン同士を接続します。
3.[整数]ノードを2つ配置して、生成する画像のサイズ(幅と高さ)を[値]プロパティに設定します。
4.[モデルサンプリングフラックス]ノード[幅]と[高さ]ピンと[整数]ノードの[整数]ピンを接続します。
5.[空のSD3潜在画像]ノードを配置して[幅]と[高さ]ピンと[整数]ノードの[整数]ピンを接続します。
6.[基本スケジューラー]ノードを配置して[モデルサンプリングフラックス]ノードの[モデル]ピンと接続します。
[整数]ノードの[値]以外のプロパティは、既定値のままでも構いません。
モデルとプロンプトからガイダーを生成するワークフロー
1.[基本ガイダー]ノードを配置します。
2.[CLIPテキストエンコード(プロンプト]ノードの[条件付け]ピンと[基本ガイダー]ノードの[コンディショニング]ピンを接続します。
3.[モデルサンプリングフラックス]ノードの[モデル]ピンと[基本ガイダー]ノードの[モデル]ピンを接続します。
サンプラーから画像を生成するワークフロー
1.[Kサンプラー選択]ノードと[カスタムサンプラー(高度)]ノードを配置して[サンプラー]ピン同士を接続します。
2.[ランダムノイズ]ノードを配置して[カスタムサンプラー(高度)]ノードの[ノイズ]ピン同士を接続します。
3.[基本ガイダー]ノードと[カスタムサンプラー(高度)]ノードの[ガイダー]ピン同士を接続します。
4.[空のSD3潜在画像]ノードの[潜在]ピン、[基本スケジューラー]ノードの[シグマ]ピンを[カスタムサンプラー]ノードのそれぞれのピンに接続します。
5.[VEAを読み込む]ノードを配置して[vea_name]プロパティに[ae.safetensors]を設定します。
6.[VEAデコード]ノードを配置して[VEAを読み込む]ノードの[VEA]ピンを接続します。
7.[カスタムサンプラー]ノードの[出力]ピンと[VEAデコード]ノードの[サンプル]ピンを接続します。
8.[画像を保存]ノードを配置して[VEAデコード]ノードの[画像]ピンと接続します。
実行すると、”緑のりんご” っぽい画像が[output]フォルダーに出力されます。
ワークフローのJSON
最後に作成したワークフローのJSONを貼り付けておきます。
保存したファイルをComfyUIの[メニュー|ファイル|開く]で選択するとワークフローが表示される(はず)です。
{
"id": "00000000-0000-0000-0000-000000000000",
"revision": 0,
"last_node_id": 30,
"last_link_id": 50,
"nodes": [
{
"id": 7,
"type": "PrimitiveInt",
"pos": [
219.67084380741093,
562.6876946220195
],
"size": [
270,
82
],
"flags": {},
"order": 0,
"mode": 0,
"inputs": [
{
"localized_name": "値",
"name": "value",
"type": "INT",
"widget": {
"name": "value"
},
"link": null
}
],
"outputs": [
{
"localized_name": "整数",
"name": "INT",
"type": "INT",
"links": [
3,
5
]
}
],
"title": "整数(幅)",
"properties": {
"Node name for S&R": "PrimitiveInt"
},
"widgets_values": [
512,
"fixed"
]
},
{
"id": 8,
"type": "PrimitiveInt",
"pos": [
225.22632476444218,
708.0580742606926
],
"size": [
270,
82
],
"flags": {},
"order": 1,
"mode": 0,
"inputs": [
{
"localized_name": "値",
"name": "value",
"type": "INT",
"widget": {
"name": "value"
},
"link": null
}
],
"outputs": [
{
"localized_name": "整数",
"name": "INT",
"type": "INT",
"links": [
4,
6
]
}
],
"title": "整数(高さ)",
"properties": {
"Node name for S&R": "PrimitiveInt"
},
"widgets_values": [
512,
"fixed"
]
},
{
"id": 10,
"type": "EmptySD3LatentImage",
"pos": [
578.7543563196188,
606.0304112357899
],
"size": [
270,
106
],
"flags": {},
"order": 7,
"mode": 0,
"inputs": [
{
"localized_name": "幅",
"name": "width",
"type": "INT",
"widget": {
"name": "width"
},
"link": 5
},
{
"localized_name": "高さ",
"name": "height",
"type": "INT",
"widget": {
"name": "height"
},
"link": 6
},
{
"localized_name": "バッチサイズ",
"name": "batch_size",
"type": "INT",
"widget": {
"name": "batch_size"
},
"link": null
}
],
"outputs": [
{
"localized_name": "潜在",
"name": "LATENT",
"type": "LATENT",
"links": [
46
]
}
],
"properties": {
"Node name for S&R": "EmptySD3LatentImage"
},
"widgets_values": [
1024,
1024,
1
]
},
{
"id": 13,
"type": "BasicScheduler",
"pos": [
582.7111793592795,
771.5856863450992
],
"size": [
270,
106
],
"flags": {},
"order": 10,
"mode": 0,
"inputs": [
{
"localized_name": "モデル",
"name": "model",
"type": "MODEL",
"link": 10
},
{
"localized_name": "スケジューラ",
"name": "scheduler",
"type": "COMBO",
"widget": {
"name": "scheduler"
},
"link": null
},
{
"localized_name": "ステップ",
"name": "steps",
"type": "INT",
"widget": {
"name": "steps"
},
"link": null
},
{
"localized_name": "ノイズ除去",
"name": "denoise",
"type": "FLOAT",
"widget": {
"name": "denoise"
},
"link": null
}
],
"outputs": [
{
"localized_name": "シグマ",
"name": "SIGMAS",
"type": "SIGMAS",
"links": [
47
]
}
],
"properties": {
"Node name for S&R": "BasicScheduler"
},
"widgets_values": [
"simple",
20,
1
]
},
{
"id": 4,
"type": "UNETLoader",
"pos": [
217.62350237674676,
419.1602127494611
],
"size": [
270,
82
],
"flags": {},
"order": 2,
"mode": 0,
"inputs": [
{
"localized_name": "unet_name",
"name": "unet_name",
"type": "COMBO",
"widget": {
"name": "unet_name"
},
"link": null
},
{
"localized_name": "重みdtype",
"name": "weight_dtype",
"type": "COMBO",
"widget": {
"name": "weight_dtype"
},
"link": null
}
],
"outputs": [
{
"localized_name": "モデル",
"name": "MODEL",
"type": "MODEL",
"links": [
7
]
}
],
"properties": {
"Node name for S&R": "UNETLoader"
},
"widgets_values": [
"flux1-dev.safetensors",
"default"
]
},
{
"id": 9,
"type": "ModelSamplingFlux",
"pos": [
568.8266892603434,
411.4655083427228
],
"size": [
295.9,
130
],
"flags": {},
"order": 8,
"mode": 0,
"inputs": [
{
"localized_name": "モデル",
"name": "model",
"type": "MODEL",
"link": 7
},
{
"localized_name": "最大シフト",
"name": "max_shift",
"type": "FLOAT",
"widget": {
"name": "max_shift"
},
"link": null
},
{
"localized_name": "基本シフト",
"name": "base_shift",
"type": "FLOAT",
"widget": {
"name": "base_shift"
},
"link": null
},
{
"localized_name": "幅",
"name": "width",
"type": "INT",
"widget": {
"name": "width"
},
"link": 3
},
{
"localized_name": "高さ",
"name": "height",
"type": "INT",
"widget": {
"name": "height"
},
"link": 4
}
],
"outputs": [
{
"localized_name": "モデル",
"name": "MODEL",
"type": "MODEL",
"links": [
10,
50
]
}
],
"properties": {
"Node name for S&R": "ModelSamplingFlux"
},
"widgets_values": [
1.15,
0.5,
1024,
1024
]
},
{
"id": 1,
"type": "DualCLIPLoader",
"pos": [
214.74581943607572,
140.21324089992214
],
"size": [
270,
130
],
"flags": {},
"order": 3,
"mode": 0,
"inputs": [
{
"localized_name": "clip_name1",
"name": "clip_name1",
"type": "COMBO",
"widget": {
"name": "clip_name1"
},
"link": null
},
{
"localized_name": "clip_name2",
"name": "clip_name2",
"type": "COMBO",
"widget": {
"name": "clip_name2"
},
"link": null
},
{
"localized_name": "タイプ",
"name": "type",
"type": "COMBO",
"widget": {
"name": "type"
},
"link": null
},
{
"localized_name": "デバイス",
"name": "device",
"shape": 7,
"type": "COMBO",
"widget": {
"name": "device"
},
"link": null
}
],
"outputs": [
{
"localized_name": "CLIP",
"name": "CLIP",
"type": "CLIP",
"links": [
1
]
}
],
"properties": {
"Node name for S&R": "DualCLIPLoader"
},
"widgets_values": [
"t5xxl_fp8_e4m3fn.safetensors",
"clip_l.safetensors",
"flux",
"default"
]
},
{
"id": 2,
"type": "CLIPTextEncode",
"pos": [
560.9267361485657,
137.19382493475624
],
"size": [
301.82736483487224,
197.19923161278086
],
"flags": {},
"order": 9,
"mode": 0,
"inputs": [
{
"localized_name": "クリップ",
"name": "clip",
"type": "CLIP",
"link": 1
},
{
"localized_name": "テキスト",
"name": "text",
"type": "STRING",
"widget": {
"name": "text"
},
"link": null
}
],
"outputs": [
{
"localized_name": "条件付け",
"name": "CONDITIONING",
"type": "CONDITIONING",
"links": [
48
]
}
],
"properties": {
"Node name for S&R": "CLIPTextEncode"
},
"widgets_values": [
"Green Apple"
]
},
{
"id": 26,
"type": "BasicGuider",
"pos": [
908.601923174549,
289.2569576552612
],
"size": [
201,
46
],
"flags": {},
"order": 11,
"mode": 0,
"inputs": [
{
"localized_name": "モデル",
"name": "model",
"type": "MODEL",
"link": 50
},
{
"localized_name": "コンディショニング",
"name": "conditioning",
"type": "CONDITIONING",
"link": 48
}
],
"outputs": [
{
"localized_name": "ガイダー",
"name": "GUIDER",
"type": "GUIDER",
"links": [
35
]
}
],
"properties": {
"Node name for S&R": "BasicGuider"
},
"widgets_values": []
},
{
"id": 29,
"type": "RandomNoise",
"pos": [
912.3474742160815,
407.07439374741733
],
"size": [
270,
82
],
"flags": {},
"order": 4,
"mode": 0,
"inputs": [
{
"localized_name": "ノイズシード",
"name": "noise_seed",
"type": "INT",
"widget": {
"name": "noise_seed"
},
"link": null
}
],
"outputs": [
{
"localized_name": "ノイズ",
"name": "NOISE",
"type": "NOISE",
"links": [
34
]
}
],
"properties": {
"Node name for S&R": "RandomNoise"
},
"widgets_values": [
168294946403286,
"randomize"
]
},
{
"id": 14,
"type": "KSamplerSelect",
"pos": [
901.4604531910044,
818.7077858016182
],
"size": [
270,
58
],
"flags": {},
"order": 5,
"mode": 0,
"inputs": [
{
"localized_name": "サンプラー名",
"name": "sampler_name",
"type": "COMBO",
"widget": {
"name": "sampler_name"
},
"link": null
}
],
"outputs": [
{
"localized_name": "サンプラー",
"name": "SAMPLER",
"type": "SAMPLER",
"links": [
45
]
}
],
"properties": {
"Node name for S&R": "KSamplerSelect"
},
"widgets_values": [
"euler"
]
},
{
"id": 25,
"type": "SamplerCustomAdvanced",
"pos": [
1227.7013804660817,
566.539137621707
],
"size": [
377.4555419921875,
302.66668701171875
],
"flags": {},
"order": 12,
"mode": 0,
"inputs": [
{
"localized_name": "ノイズ",
"name": "noise",
"type": "NOISE",
"link": 34
},
{
"localized_name": "ガイダー",
"name": "guider",
"type": "GUIDER",
"link": 35
},
{
"localized_name": "サンプラー",
"name": "sampler",
"type": "SAMPLER",
"link": 45
},
{
"localized_name": "シグマ",
"name": "sigmas",
"type": "SIGMAS",
"link": 47
},
{
"localized_name": "潜在イメージ",
"name": "latent_image",
"type": "LATENT",
"link": 46
}
],
"outputs": [
{
"localized_name": "出力",
"name": "output",
"type": "LATENT",
"links": [
49
]
},
{
"localized_name": "デノイズ出力",
"name": "denoised_output",
"type": "LATENT",
"links": null
}
],
"properties": {
"Node name for S&R": "SamplerCustomAdvanced"
},
"widgets_values": []
},
{
"id": 23,
"type": "VAEDecode",
"pos": [
1712.0182934237384,
577.7002406255546
],
"size": [
258.10393560302737,
46
],
"flags": {},
"order": 13,
"mode": 0,
"inputs": [
{
"localized_name": "サンプル",
"name": "samples",
"type": "LATENT",
"link": 49
},
{
"localized_name": "vae",
"name": "vae",
"type": "VAE",
"link": 20
}
],
"outputs": [
{
"localized_name": "画像",
"name": "IMAGE",
"type": "IMAGE",
"links": [
22
]
}
],
"properties": {
"Node name for S&R": "VAEDecode"
},
"widgets_values": []
},
{
"id": 24,
"type": "VAELoader",
"pos": [
1340.8290248690523,
924.6886247503097
],
"size": [
270,
58
],
"flags": {},
"order": 6,
"mode": 0,
"inputs": [
{
"localized_name": "vae_name",
"name": "vae_name",
"type": "COMBO",
"widget": {
"name": "vae_name"
},
"link": null
}
],
"outputs": [
{
"localized_name": "VAE",
"name": "VAE",
"type": "VAE",
"links": [
20
]
}
],
"properties": {
"Node name for S&R": "VAELoader"
},
"widgets_values": [
"ae.safetensors"
]
},
{
"id": 21,
"type": "SaveImage",
"pos": [
1731.8831336336998,
692.1500901128595
],
"size": [
314.673828125,
270
],
"flags": {},
"order": 14,
"mode": 0,
"inputs": [
{
"localized_name": "画像",
"name": "images",
"type": "IMAGE",
"link": 22
},
{
"localized_name": "ファイル名_プレフィックス",
"name": "filename_prefix",
"type": "STRING",
"widget": {
"name": "filename_prefix"
},
"link": null
}
],
"outputs": [],
"properties": {},
"widgets_values": [
"ComfyUI"
]
}
],
"links": [
[
1,
1,
0,
2,
0,
"CLIP"
],
[
3,
7,
0,
9,
3,
"INT"
],
[
4,
8,
0,
9,
4,
"INT"
],
[
5,
7,
0,
10,
0,
"INT"
],
[
6,
8,
0,
10,
1,
"INT"
],
[
7,
4,
0,
9,
0,
"MODEL"
],
[
10,
9,
0,
13,
0,
"MODEL"
],
[
20,
24,
0,
23,
1,
"VAE"
],
[
22,
23,
0,
21,
0,
"IMAGE"
],
[
34,
29,
0,
25,
0,
"NOISE"
],
[
35,
26,
0,
25,
1,
"GUIDER"
],
[
45,
14,
0,
25,
2,
"SAMPLER"
],
[
46,
10,
0,
25,
4,
"LATENT"
],
[
47,
13,
0,
25,
3,
"SIGMAS"
],
[
48,
2,
0,
26,
1,
"CONDITIONING"
],
[
49,
25,
0,
23,
0,
"LATENT"
],
[
50,
9,
0,
26,
0,
"MODEL"
]
],
"groups": [],
"config": {},
"extra": {
"ds": {
"scale": 0.38554328942953175,
"offset": [
2312.988583505018,
-20.874663103992766
]
},
"workflowRendererVersion": "LG"
},
"version": 0.4
}
まとめ
今回は[ComfyUI]と[FLUX.1-dev]でガイダーを使ってプロンプトから画像を生成するためのワークフローを作成する手順について紹介しました。
[ComfyUI]で[FLUX.1-dev]を動作させる必要最低限のノードに[基本ガイダー]ノードを追加して、少し詳細な画像が出力できそうなワークフローを作成してみました。
[ComfyUI]で[FLUX.1-dev]を動作させるワークフローを作りたい人の参考になれば幸いです。
スポンサーリンク
最後までご覧いただき、ありがとうございます。





