Nitro-E によるテキストからの画像生成(ソースコードと説明と利用ガイド)
プログラム利用ガイド
1. このプログラムの利用シーン
テキストプロンプトから画像を自動生成するためのソフトウェアである。アイデアを視覚化したり、デザインの参考資料を作成したり、創作活動の支援に活用できる。軽量なモデルを使用しているため、一般的なPCでも実行可能である。
2. 主な機能
- テキストから画像生成: 英語のテキスト説明を入力すると、それに対応する画像を生成する。
- 生成モードの選択: 以下の3つのモードから選択できる。
- モード1(4ステップ版・蒸留版): 生成速度を重視した高速モード。
- モード2(20ステップ版・通常版): 画質を重視したモード。
- モード3(20ステップ版・GRPO版): 強化学習により人間の好みに最適化されたモード。
- 自動環境構築: 必要なモデルとライブラリを自動的にダウンロードし、セットアップする。
- デバイス自動認識: GPUが利用可能な場合は自動的に検出し、ない場合はCPUで動作する。
- 画像ファイル保存: 生成された画像をPNG形式でファイルに保存する。
3. 基本的な使い方
- 事前準備:
プログラムのコメントに記載されているパッケージをインストールする。モード3(GRPO版)を使用する場合は、追加で「peft」パッケージのインストールが必要である。
Hugging Faceにログインし、Llama-3.2-1Bへのアクセス許可を取得する必要がある。
- プログラムの実行:
Pythonでプログラムを実行すると、モード選択画面が表示される。
キーボードで「1」(高速モード)、「2」(高品質・通常版)、または「3」(高品質・GRPO版)を入力し、Enterキーを押す。
- 初回実行時の処理:
GitHubリポジトリのクローン、モデルのダウンロードが自動的に行われる。
この処理には時間がかかるが、2回目以降は不要である。
- 画像の生成:
プログラムが自動的に画像を生成し、「output.png」として保存する。
デフォルトでは「A hot air balloon in the shape of a heart grand canyon」というプロンプトが使用される。
4. 便利な機能
- プロンプトのカスタマイズ: プログラム内の「prompt」変数を編集することで、生成したい画像の内容を自由に変更できる。
- 解像度の変更: デフォルトは512×512ピクセルであるが、「resolution」変数を編集することで変更可能である。
- 生成ステップ数の調整: 「num_inference_steps」変数を変更することで、生成品質と速度のバランスを調整できる。
- ガイダンススケールの調整: 「guidance_scale」変数を変更することで、プロンプトへの忠実度を調整できる。値を大きくするとプロンプトに忠実になるが、画像の多様性は減少する。
Python開発環境,ライブラリ類
ここでは、最低限の事前準備について説明する。機械学習や深層学習を行う場合は、NVIDIA CUDA、Visual Studio、Cursorなどを追加でインストールすると便利である。これらについては別ページ https://www.kkaneko.jp/cc/dev/aiassist.htmlで詳しく解説しているので、必要に応じて参照してください。
Python 3.12 のインストール
インストール済みの場合は実行不要。
管理者権限でコマンドプロンプトを起動(手順:Windowsキーまたはスタートメニュー > cmd と入力 > 右クリック > 「管理者として実行」)し、以下を実行する。管理者権限は、wingetの--scope machineオプションでシステム全体にソフトウェアをインストールするために必要である。
REM Python をシステム領域にインストール
winget install --scope machine --id Python.Python.3.12 -e --silent
REM Python のパス設定
set "PYTHON_PATH=C:\Program Files\Python312"
set "PYTHON_SCRIPTS_PATH=C:\Program Files\Python312\Scripts"
echo "%PATH%" | find /i "%PYTHON_PATH%" >nul
if errorlevel 1 setx PATH "%PATH%;%PYTHON_PATH%" /M >nul
echo "%PATH%" | find /i "%PYTHON_SCRIPTS_PATH%" >nul
if errorlevel 1 setx PATH "%PATH%;%PYTHON_SCRIPTS_PATH%" /M >nul【関連する外部ページ】
Python の公式ページ: https://www.python.org/
AI エディタ Windsurf のインストール
Pythonプログラムの編集・実行には、AI エディタの利用を推奨する。ここでは,Windsurfのインストールを説明する。
管理者権限でコマンドプロンプトを起動(手順:Windowsキーまたはスタートメニュー > cmd と入力 > 右クリック > 「管理者として実行」)し、以下を実行して、Windsurfをシステム全体にインストールする。管理者権限は、wingetの--scope machineオプションでシステム全体にソフトウェアをインストールするために必要となる。
winget install --scope machine Codeium.Windsurf -e --silent【関連する外部ページ】
Windsurf の公式ページ: https://windsurf.com/
必要なライブラリのインストール
コマンドプロンプトを管理者として実行(手順:Windowsキーまたはスタートメニュー > cmd と入力 > 右クリック > 「管理者として実行」)し、以下を実行する
pip install -U torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu126
pip install peft diffusers==0.32.2 transformers==4.49.0 accelerate==1.7.0 torchmetrics einops omegaconf sentencepiece==0.2.0
pip install huggingface_hub
Hugging Faceの認証
以下の手順を実行。
- Hugging Faceアカウントを作成(未作成の場合)
(アカウント作成済みの場合は,https://huggingface.co/ にアクセスしてログイン)
- https://huggingface.co/ にアクセス
- 画面右上の「Sign Up」ボタンをクリック
- メールアドレスとパスワードを入力してアカウントを作成
- 登録したメールアドレスに届く確認メールから認証を完了
- Llama-3.2-1Bモデルへのアクセス権を取得
- https://huggingface.co/meta-llama/Llama-3.2-1B にアクセス
- ページ中央に表示される利用規約(LLAMA 3.2 COMMUNITY LICENSE AGREEMENT)を読む
- ページ下部の「Log in」または「Sign Up」リンクをクリックしてログインする
- ログイン後、利用規約に同意するためのフォームが表示される
- 必要事項を入力し、「I Accept」をクリックする
- アクセストークンを作成する
- https://huggingface.co/settings/tokens にアクセスする
- 「New token」ボタンをクリックする
- Token name(トークン名)を入力する(例:nitro-e-token)
- Type(タイプ)で「Read」を選択する
- 「Generate a token」ボタンをクリックする
- 表示されたトークン(
hf_で始まる文字列)の右側にある「Copy」ボタンをクリックしてコピーする
- Hugging Face CLIをインストールしてログインする
# Hugging Face CLIをインストール pip install huggingface_hub # トークンでログイン huggingface-cli loginコマンド実行後、以下のように表示される:
Token:コピーしたトークンを貼り付けてEnterキーを押す。
次に以下のように表示される:
Add token as git credential? (Y/n)Enterキーを押す(デフォルトでYes)。
ログインに成功すると以下のように表示される:
Token is valid (permission: read). Your token has been saved to /home/username/.cache/huggingface/token Login successful
認証の特徴
- トークンは
~/.cache/huggingface/tokenに安全に保存される - 一度設定すれば永続的に使用できる(PC再起動後も有効)
- 以降、Hugging Faceからモデルをダウンロードする際に自動的に認証される
Pythonコードの実行
認証完了後、Nitro-Eのコードを実行する。
プログラムコードの説明
1. 概要
このプログラムは、テキストプロンプトから画像を生成するAMD社の軽量画像生成モデル「Nitro-E」を利用する。304M(3億400万)パラメータという小規模な構成で、512×512ピクセルの画像を生成する。プログラムは、4ステップで生成を行う蒸留版、20ステップで生成を行う通常版、20ステップで生成を行うGRPO版の3つのモードを提供する。
2. 主要技術
Efficient Multimodal Diffusion Transformer (E-MMDiT)
Nitro-EはE-MMDiTというアーキテクチャを採用している[1][2]。これはMultimodal Diffusion Transformer (MMDiT)を基盤とし、複数の改良を加えたものである。MMDiTは異なるモダリティ(テキストと画像)を処理するために別々の重みセットを使用し、統合された注意機構で特徴を融合する。E-MMDiTでは、マルチパス圧縮モジュールによって画像トークン数を68.5%削減する。
Diffusion Transformer (DiT)
Diffusion Transformer (DiT) [3]は、拡散モデルにTransformerアーキテクチャを適用した生成モデルである。従来のU-Netバックボーンを、潜在空間のパッチに対して動作するTransformerに置き換える。DiTは計算量の観点から優れたスケーラビリティを示し、モデル規模の拡大によって生成品質が向上する特性を持つ。
3. 技術的特徴
- 圧縮率の高いビジュアルエンコーダ
DC-AE(Deep Compression Autoencoder)を採用し、32倍のダウンサンプリング比率で画像を圧縮する。
- 軽量なテキストエンコーダ
テキストエンコーダにLlama-3.2-1B(10億パラメータ)を使用する。
- トークン圧縮モジュール
マルチパス圧縮モジュールが2倍と4倍の2つの圧縮比率でトークンを処理し、後続のブロックで統合処理を行う。この仕組みによりTransformerブロック内の視覚トークン数が68.5%削減される。
- 位置情報の強化
圧縮と復元の過程で失われる位置情報を補うため、復元されたトークンに位置情報を明示的に再付与するPosition Reinforcement機構を導入する。
- 交互サブリージョン注意機構
Alternating Subregion Attention (ASA)では、トークンをサブグループに分割して並列に注意計算を行う。グループ化パターンをブロック間で交互に変更することで、固定領域への制限を回避しながら計算量を削減する。
- 蒸留による高速化
教師モデルと生徒モデルの生成分布を敵対的学習で整合させることで、推論ステップ数を20から4に削減する。
- 強化学習による品質向上
Group Relative Policy Optimization (GRPO) は、報酬に基づいて生成品質を向上させる強化学習手法である。GenEval(画像とテキストの整合性)やHPSv2.1(人間の好み)などの報酬関数を組み合わせて使用する。
4. 実装の特色
プログラムは以下の機能を実装している:
- GitHubリポジトリの自動クローンとセットアップ
- GPU/CPUの自動検出と適切なデバイス・データ型の選択
- 3つの生成モードの選択機能(4ステップの蒸留版、20ステップの通常版、20ステップのGRPO版)
- Hugging Faceからのモデルウェイトの自動ダウンロード
- 生成画像をPNG形式で保存
モデルは2500万枚の画像で学習されている。内訳は実画像1110万枚、Midjourneyで生成された画像440万枚、FLUX.1-devで生成された画像950万枚である。
5. 参考文献
[1] Esser, P., et al. (2024). Scaling Rectified Flow Transformers for High-Resolution Image Synthesis. arXiv preprint arXiv:2403.03206. https://arxiv.org/abs/2403.03206
[2] AMD. (2025). Nitro-E: A 304M Diffusion Transformer Model for High Quality Image Generation. ROCm Blogs. https://rocm.blogs.amd.com/artificial-intelligence/nitro-e/README.html
[3] Peebles, W., & Xie, S. (2023). Scalable Diffusion Models with Transformers. Proceedings of the IEEE/CVF International Conference on Computer Vision (ICCV), 4195-4205. https://arxiv.org/abs/2212.09748
6. ソースコード
# Nitro-E によるテキストからの画像生成
# 事前に以下のコマンドを実行してパッケージをインストールしてください:
# pip install -U torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu126
# pip install peft diffusers==0.32.2 transformers==4.49.0 accelerate==1.7.0 torchmetrics einops omegaconf sentencepiece==0.2.0
# pip install huggingface_hub
#
# Hugging Faceにログインしてください:
# huggingface-cli login
#
# Llama-3.2-1Bへのアクセス許可を取得してください:
# https://huggingface.co/meta-llama/Llama-3.2-1B
import os
import sys
import subprocess
import torch
def setup_nitro_e():
"""Nitro-Eのセットアップを行う"""
# リポジトリのクローン
repo_dir = "Nitro-E"
if not os.path.exists(repo_dir):
print("Nitro-Eリポジトリをクローンしています...")
subprocess.run(["git", "clone", "https://github.com/AMD-AGI/Nitro-E.git"], check=True)
else:
print("Nitro-Eリポジトリは既に存在します")
# リポジトリディレクトリのパスをPythonパスに追加
repo_path = os.path.abspath(repo_dir)
if repo_path not in sys.path:
sys.path.insert(0, repo_path)
print("セットアップが完了しました")
return repo_path
def generate_image(repo_path, mode):
"""画像生成を実行する"""
# CPU/GPUの自動認識
if torch.cuda.is_available():
device = torch.device('cuda:0')
dtype = torch.bfloat16
print("GPU を使用します")
else:
device = torch.device('cpu')
dtype = torch.float32
print("CPU を使用します")
# coreモジュールをインポート
from core.tools.inference_pipe import init_pipe
# モデルの設定
repo_name = "amd/Nitro-E"
resolution = 512
if mode == 1:
# 4ステップ版(蒸留版)
ckpt_name = 'Nitro-E-512px-dist.safetensors'
num_inference_steps = 4
guidance_scale = 0
print("4ステップ版(蒸留版)を使用します")
elif mode == 2:
# 20ステップ版(通常版)
ckpt_name = 'Nitro-E-512px.safetensors'
num_inference_steps = 20
guidance_scale = 4.5
print("20ステップ版(通常版)を使用します")
elif mode == 3:
# 20ステップ版(GRPO版)
ckpt_name = 'Nitro-E-512px.safetensors'
num_inference_steps = 20
guidance_scale = 4.5
print("20ステップ版(GRPO版)を使用します")
else:
print("無効なモードです。モード1を使用します。")
ckpt_name = 'Nitro-E-512px-dist.safetensors'
num_inference_steps = 4
guidance_scale = 0
# パイプラインの初期化
print("モデルを読み込んでいます...")
if mode == 3:
# GRPO版を使用する場合
pipe = init_pipe(device, dtype, resolution, repo_name=repo_name, ckpt_name=ckpt_name, ckpt_path_grpo='ckpt_grpo_512px')
else:
# 通常版または蒸留版
pipe = init_pipe(device, dtype, resolution, repo_name=repo_name, ckpt_name=ckpt_name)
# 画像生成
prompt = 'A hot air balloon in the shape of a heart grand canyon'
print(f"画像を生成しています: {prompt}")
images = pipe(
prompt=prompt,
width=resolution,
height=resolution,
num_inference_steps=num_inference_steps,
guidance_scale=guidance_scale
).images
# 画像の保存
output_path = "output.png"
images[0].save(output_path)
print(f"画像を {output_path} として保存しました")
# メニュー表示
print("モード選択:")
print("1: 4ステップ版(高速・蒸留版)")
print("2: 20ステップ版(高品質・通常版)")
print("3: 20ステップ版(高品質・GRPO版)")
mode = input("選択してください (1, 2 または 3): ")
if mode == "1":
selected_mode = 1
elif mode == "2":
selected_mode = 2
elif mode == "3":
selected_mode = 3
else:
print("無効な選択です。モード1を使用します。")
selected_mode = 1
# セットアップ実行
repo_path = setup_nitro_e()
# 画像生成実行
generate_image(repo_path, selected_mode)
実験・研究スキルの基礎:Google Colabで学ぶ画像生成実験
1. 実験・研究のスキル構成要素
実験や研究を行うには、以下の5つの構成要素を理解する必要がある。
1.1 実験用データ
このプログラムではテキストプロンプト(英語の文章)が実験用データである。
1.2 実験計画
何を明らかにするために実験を行うのかを定める。
計画例:
- 生成ステップ数が画像品質に与える影響を確認する
- ガイダンススケールがプロンプトへの忠実度に与える影響を確認する
- 3つのモード(蒸留版・通常版・GRPO版)の生成品質を比較する
- プロンプトの記述方法(詳細度・単語選択)が生成結果に与える影響を探る
- 特定の対象物(人物・風景・物体など)を安定して生成できる条件を見つける
1.3 プログラム
実験を実施するためのツールである。このプログラムはAMD社のNitro-E(304Mパラメータの軽量拡散モデル)を使用している。
- プログラムの機能を理解して活用することが基本である
- 基本となるプログラムを出発点として、将来、様々な機能を自分で追加することができる
1.4 プログラムの機能
このプログラムは複数のパラメータで画像生成を制御する。
入力パラメータ:
- プロンプト:生成したい画像の内容を英語で記述
- モード選択:3つのモード(1:蒸留版4ステップ、2:通常版20ステップ、3:GRPO版20ステップ)
- 解像度:生成画像のサイズ(デフォルト512×512ピクセル)
- 生成ステップ数:推論の反復回数(モードにより4または20)
- ガイダンススケール:プロンプトへの忠実度(モードにより0または4.5)
出力情報:
- 生成された画像(output.pngとして保存)
- 使用モデルの情報
- 処理時間(初回はモデルダウンロード時間を含む)
プログラムの動作:
- モード選択後、自動的にモデルを読み込み、画像生成を実行する
- 生成された画像はカレントディレクトリに保存される
1.5 検証(結果の確認と考察)
プログラムの実行結果を観察し、パラメータの影響を考察する。
基本認識:
- パラメータを変えると結果が変わる。その変化を観察することが実験である
- 「良い結果」「悪い結果」は目的によって異なる
観察のポイント:
- 生成画像はプロンプトの内容を反映しているか
- 画像の品質(細部の描写、色彩、構図)はどうか
- プロンプトに記述した要素が全て含まれているか
- 意図しない要素や不自然な部分は含まれていないか
- モード間で画質や表現にどのような違いがあるか
- 生成速度と品質のバランスはどうか
2. 間違いの原因と対処方法
2.1 プログラムのミス(人為的エラー)
プログラムがエラーで停止する
- 原因:必要なライブラリがインストールされていない、Hugging Faceへのログインが完了していない
- 対処方法:エラーメッセージを確認し、インストールコマンドを実行する。特にpeftライブラリはGRPO版(モード3)で必須である
モデルのダウンロードに時間がかかる
- 原因:初回実行時にモデルウェイトをHugging Faceからダウンロードしている
- 対処方法:これは正常な動作である。ダウンロードが完了するまで待つ。2回目以降は高速に起動する
Llama-3.2-1Bへのアクセスエラーが出る
- 原因:Hugging Faceでモデルへのアクセス許可を取得していない
- 対処方法:Hugging Faceのウェブサイトでモデルページにアクセスし、利用規約に同意してアクセス許可を取得する
2.2 期待と異なる結果が出る場合
プロンプトと全く異なる画像が生成される
- 原因:プロンプトが英語で記述されていない、または極端に短い・曖昧な表現である
- 対処方法:プロンプトを英語で記述し、生成したい内容を具体的に説明する。「A red car on a mountain road」のように対象物・特徴・場所を含める
画像の品質が低い・ぼやけている
- 原因:モード1(蒸留版)を使用している、または解像度が低い
- 対処方法:モード2(通常版)またはモード3(GRPO版)を試す。解像度を512から1024に変更する(ただし処理時間が増加する)
プロンプトに記述した要素が欠けている
- 原因:ガイダンススケールが低い(モード1では0)、またはプロンプトが複雑すぎる
- 対処方法:モード2またはモード3(ガイダンススケール4.5)を使用する。プロンプトをシンプルにして重要な要素に絞る
生成に時間がかかりすぎる
- 原因:モード2またはモード3(20ステップ)を使用している、GPUが利用できていない
- 対処方法:速度を優先する場合はモード1(4ステップ)を使用する。Google ColabでGPUランタイムを有効にする
同じプロンプトでも実行ごとに異なる画像が生成される
- 原因:拡散モデルはランダムノイズから生成を開始するため、実行ごとに異なる結果が得られる
- 対処方法:これは正常な動作である。再現性が必要な場合は、プログラムにrandom seedを設定する機能を追加する
3. 実験レポートのサンプル
生成モードが画像品質に与える影響
実験目的:
3つの生成モード(蒸留版・通常版・GRPO版)の画像品質と生成速度を比較し、用途に応じた最適なモードを見つける。
実験計画:
同一のプロンプトを使用し、各モードで画像を生成して品質を評価する。
実験方法:
プロンプト「A serene mountain landscape with a crystal clear lake」を使用し、以下の基準で評価する:
- プロンプト忠実度:記述した要素(山・湖・透明度)が含まれているか(5段階評価)
- 画像品質:細部の描写・色彩・構図の質(5段階評価)
- 生成速度:画像生成にかかった時間(秒)
- 総合評価:品質と速度のバランス(5段階評価)
実験結果:
| モード | ステップ数 | ガイダンス | プロンプト忠実度 | 画像品質 | 生成速度(秒) | 総合評価 |
|---|---|---|---|---|---|---|
| モード1(蒸留版) | 4 | 0 | x/5 | x/5 | x.x | x/5 |
| モード2(通常版) | 20 | 4.5 | x/5 | x/5 | x.x | x/5 |
| モード3(GRPO版) | 20 | 4.5 | x/5 | x/5 | x.x | x/5 |
考察:
- (例文)モードxxxx(蒸留版)は生成速度が速いが、プロンプトに記述した「透明度」の表現が不十分で、湖の描写が曖昧であった
- (例文)モードxxxx(通常版)ではプロンプトの要素がほぼ反映され、山と湖の描写も自然であった。生成速度と品質のバランスが良い
- (例文)モードxxxx(GRPO版)では細部まで精密に描写され、色彩も鮮やかで最も高品質な画像が得られた。特に水面の透明感が際立っていた
- (例文)生成ステップ数が多いほど品質が向上するが、処理時間も比例して増加する。ガイダンススケールの有無もプロンプト忠実度に大きく影響することが確認できた
結論:
(例文)本実験では、モードxxxxが最も高品質な画像を生成したが、速度を重視する場合はモードxxxxも実用的である。デザインの初期段階でアイデアを素早く可視化する用途にはモードxxxx、最終成果物として高品質な画像が必要な場合にはモードxxxxが適している。用途に応じてモードを使い分けることで、効率的な画像生成ワークフローを構築できることが確認できた。