
2026/01/19 3:01
Flux 2 Klein 純粋 C 推論
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
ドキュメントは、テキストから画像および画像から画像へのタスクの両方をサポートする純粋なC実装であるFLUX.2‑klein‑4B画像生成モデルについて説明しています。外部依存関係はC標準ライブラリのみで、HuggingFace から小さな Python スクリプト (
pip install huggingface_hub) を介して VAE、Transformer、Qwen3‑4B エンコーダ、トークナイザを含む約16 GBの事前学習済み重みをロードします。Apple の Silicon 上では Metal Performance Shaders、Linux/Intel macOS では BLAS(OpenBLAS)によるオプションの高速化が可能で、最大約30倍の速度向上と Apple マシン上で自動的に GPU を使用します。
ライブラリは単純な C API (
flux_load_dir、flux_generate、flux_img2img など) を公開しており、ユーザーのプロジェクトへリンクできます。サンプルコードではプログラムから画像を生成または変換する方法が示されています。またコマンドライン利用も可能で、例として ./flux -d flux-klein-model -p "prompt" -o out.png(テキスト→画像)や -i input.png と -t strength を付けて画像→画像を実行します。オプションには幅/高さ(64–1024 px、16ピクセル単位)、ステップ数(デフォルト 4)、シード、quiet/verbose フラグが含まれます。
プロンプトのエンコード後、Qwen3‑4B エンコーダは自動的に解放され(約8 GB が解放)拡散中のピークメモリを約16 GB に抑えます。複数のプロンプトが同じエンコーダを再利用でき、再ロードは不要です。サポートされる最大解像度は 1024×1024 ピクセル、最小は 64×64 で、VAE のダウンサンプリングにより 16 の倍数に制限されています。
MIT ライセンスの下で配布されるこのパッケージは、軽量かつ依存関係がないため組み込みシステム、高性能サーバー、クロスプラットフォームアプリケーションに適しています。オープンソースおよび商用プロジェクトの両方で広く採用されることを奨励します。
本文
FLUX.2‑klein‑4B Pure C実装
このプログラムは、Black Forest Labs の FLUX.2‑klein‑4B モデルを用いてテキストプロンプト(およびオプションで他の画像)から画像を生成します。
ライブラリとしても利用可能で、C だけで実装されており、標準ライブラリ以外に依存はありません。MPS と BLAS のアクセラレーションは任意ですが推奨です。
概要
- ゼロ行の手作業コードで書かれた最初のオープンソースプロジェクト。すべてのロジックは Claude Code(Claude Max プラン)によって生成されました。
- 量子化やモデル変換は不要です。float 重みを含む safetensors ファイルをそのまま使用します。
- このコードベースは、Python スタックに依存しない推論システムが実用的であることを示し、オープンモデルの利用を解放し AI をより身近なものにしています。
クイックスタート
# ビルド(バックエンドを選択) make mps # Apple Silicon (最速) make blas # Intel Mac / Linux で OpenBLAS 使用時 make generic # 純粋 C、依存なし # モデルダウンロード (~16 GB) pip install huggingface_hub python download_model.py # 画像生成 ./flux -d flux-klein-model -p "A woman wearing sunglasses" -o output.png
推論時には Python ランタイム、PyTorch、CUDA ツールキットは不要です。
サンプル出力
./flux -d flux-klein-model \ -p "A picture of a woman in 1960 America. Sunglasses. ASA 400 film. Black and White." \ -W 250 -H 250 -o /tmp/woman.png
画像→画像変換:
./flux -d flux-klein-model -i /tmp/woman.png \ -p "oil painting of woman with sunglasses" -v -H 256 -W 256 \ -o /tmp/woman2.png
主な機能
| 機能 | 説明 |
|---|---|
| 依存なし | 純粋 C 実装で、単体動作可能。 |
| BLAS アクセラレーション | 約30倍速(macOS では Apple Accelerate、Linux では OpenBLAS)。 |
| Metal GPU アクセラレーション | Apple Silicon Mac なら自動有効化。 |
| テキスト→画像・画像→画像 | プロンプトから生成するか既存の画像を変換。 |
| 統合テキストエンコーダ | Qwen3‑4B が組み込まれており、外部埋め込み計算不要。 |
| メモリ効率 | エンコーダは使用後自動解放(約8 GBが開放)。 |
使い方
テキスト→画像
./flux -d flux-klein-model \ -p "A fluffy orange cat sitting on a windowsill" \ -o cat.png
画像→画像(スタイル転送)
./flux -d flux-klein-model \ -p "oil painting style" \ -i photo.png \ -o painting.png \ -t 0.7
-t (strength) は画像の変化量を制御します。
- 0.0 – 変更なし(出力=入力)
- 1.0 – 完全生成(入力は構図ヒントのみ)
- 0.7 – スタイル転送に適したバランス
コマンドラインオプション
| オプション | 短縮形 | 説明 |
|---|---|---|
| モデルディレクトリへのパス(必須)。 | |
| 生成用テキストプロンプト(必須)。 | |
| 出力画像パス (.png または .ppm)(必須)。 | |
| 生成 | ||
| 出力幅 (デフォルト 256)。 | |
| 出力高さ (デフォルト 256)。 | |
| サンプリングステップ数 (デフォルト 4)。 | |
| 再現性のための乱数シード。 | |
| 画像→画像 | ||
| img2img 用入力画像。 | |
| 画像変更量 (0.0–1.0、デフォルト 0.75)。 | |
| 出力 | ||
| 静かなモード(何も表示しない)。 | |
| 詳細設定とタイミング情報を表示。 | |
| その他 | ||
| 事前計算済みテキスト埋め込みのロード(上級者向け)。 | |
| ヘルプを表示。 |
再現性
乱数シードは必ず stderr に出力されます。
$ ./flux -d flux-klein-model -p "a landscape" -o out.png Seed: 1705612345 out.png
同じ画像を再生成するには、印刷されたシードを使用します:
./flux -d flux-klein-model -p "a landscape" -o out.png -S 1705612345
ビルド
ビルド時にバックエンドを選択
make # 利用可能なバックエンド一覧表示 make generic # 純粋 C、依存なし(遅い) make blas # BLAS アクセラレーション (~30倍高速) make mps # Apple Silicon Metal GPU (最速、macOS 限定)
推奨設定
- macOS Apple Silicon:
make mps - macOS Intel:
make blas - Linux OpenBLAS 使用時:
make blas - Linux で OpenBLAS 未使用時:
make generic
make blas
(Linux)の手順
make blas# Ubuntu/Debian sudo apt install libopenblas-dev # Fedora sudo dnf install openblas-devel
その他のターゲット
make clean # ビルドアーティファクトを削除 make info # このプラットフォームで利用可能なバックエンド表示 make test # 参照画像テスト実行
モデルダウンロード
モデル重みは HuggingFace から取得します。
pip install huggingface_hub python download_model.py
これにより
./flux-klein-model に約16 GBがダウンロードされます:
| コンポーネント | サイズ |
|---|---|
| VAE (AutoencoderKL) | ~300 MB |
| Transformer | ~4 GB |
| Qwen3‑4B テキストエンコーダ | ~8 GB |
| Tokenizer | — |
技術詳細
モデル構成
| コンポーネント | 説明 |
|---|---|
| Transformer | 5 ダブルブロック + 20 シングルブロック、隠れ次元 3072、注意ヘッド数 24 |
| VAE | AutoencoderKL、128 ラティットチャネル、8×空間圧縮 |
| テキストエンコーダ | Qwen3‑4B、36 層、隠れ次元 2560 |
推論は「ディルクションモデル」で 4 ステップ のサンプリングを使用します。
メモリ要件
| フェーズ | 推定メモリ |
|---|---|
| テキストエンコード | ~8 GB(エンコーダ重み) |
| ディフュージョン | ~8 GB(トランスフォーマー約4 GB + VAE 約300 MB + 活性化) |
| ピーク | ~16 GB(エンコーダが解放されていない場合) |
テキストエンコーダは使用後自動で解放され、ディフュージョン時のピークメモリを削減します。異なるプロンプトで複数画像を生成する際には、エンコーダが再ロードされます。
解像度制限
- 最大: 1024 × 1024 ピクセル(それ以上は膨大なメモリが必要)
- 最小: 64 × 64 ピクセル
- VAE の下り圧縮係数により、寸法は必ず 16 の倍数である必要があります。
C ライブラリ API
libflux.a をリンクし、flux.h をインクルードしてください。
コア関数
flux_ctx *flux_load_dir(const char *model_dir); /* モデルをロード、失敗時は NULL */ void flux_free(flux_ctx *ctx); /* すべてのリソース解放 */ flux_image *flux_generate(flux_ctx *ctx, const char *prompt, const flux_params *params); flux_image *flux_img2img(flux_ctx *ctx, const char *prompt, const flux_image *input, const flux_params *params);
画像操作
flux_image *flux_image_load(const char *path); /* PNG または PPM をロード */ int flux_image_save(const flux_image *img, const char *path); /* 0=成功、-1=エラー */ flux_image *flux_image_resize(const flux_image *img, int new_w, int new_h); void flux_image_free(flux_image *img);
ユーティリティ
void flux_set_seed(int64_t seed); /* 乱数シード設定(再現性) */ const char *flux_get_error(void); /* 最後のエラーメッセージ取得 */ void flux_release_text_encoder(flux_ctx *ctx); /* 手動で ~8 GB を解放(任意) */
パラメータ構造体
typedef struct { int width; /* 出力幅 (デフォルト 256) */ int height; /* 出力高さ (デフォルト 256) */ int num_steps; /* デノイズステップ数、klein 用は 4 (デフォルト 4) */ float guidance_scale; /* CFG スケール、klein 用は 1.0 (デフォルト 1.0) */ int64_t seed; /* 乱数シード、-1 はランダム (デフォルト -1) */ float strength; /* img2img のみ: 0.0–1.0 (デフォルト 0.75) */ } flux_params; #define FLUX_PARAMS_DEFAULT { 256, 256, 4, 1.0f, -1, 0.75f }
サンプルプログラム
テキスト→画像生成
#include "flux.h" #include <stdio.h> int main(void) { flux_ctx *ctx = flux_load_dir("flux-klein-model"); if (!ctx) { fprintf(stderr, "Failed to load model: %s\n", flux_get_error()); return 1; } flux_params params = FLUX_PARAMS_DEFAULT; params.width = 512; params.height = 512; params.seed = 42; /* -1 はランダムシード */ flux_image *img = flux_generate(ctx, "A fluffy orange cat in a sunbeam", ¶ms); if (!img) { fprintf(stderr, "Generation failed: %s\n", flux_get_error()); flux_free(ctx); return 1; } flux_image_save(img, "cat.png"); printf("Saved cat.png (%dx%d)\n", img->width, img->height); flux_image_free(img); flux_free(ctx); return 0; }
コンパイル例:
# macOS gcc -o myapp myapp.c -L. -lflux -lm -framework Accelerate # Linux gcc -o myapp myapp.c -L. -lflux -lm -lopenblas
画像→画像変換
#include "flux.h" #include <stdio.h> int main(void) { flux_ctx *ctx = flux_load_dir("flux-klein-model"); if (!ctx) return 1; flux_image *photo = flux_image_load("photo.png"); if (!photo) { fprintf(stderr, "Failed to load image\n"); flux_free(ctx); return 1; } flux_params params = FLUX_PARAMS_DEFAULT; params.strength = 0.7; /* 0.0: 変更なし、1.0: 完全再生成 */ params.seed = 123; flux_image *painting = flux_img2img(ctx, "oil painting, impressionist style", photo, ¶ms); flux_image_free(photo); if (!painting) { fprintf(stderr, "Transformation failed: %s\n", flux_get_error()); flux_free(ctx); return 1; } flux_image_save(painting, "painting.png"); printf("Saved painting.png\n"); flux_image_free(painting); flux_free(ctx); return 0; }
エラーハンドリング
失敗する可能性のある関数は
NULL を返します。flux_get_error() で説明を取得してください。
flux_ctx *ctx = flux_load_dir("nonexistent-model"); if (!ctx) { fprintf(stderr, "Error: %s\n", flux_get_error()); /* 例: "Failed to load VAE - cannot generate images" */ }
ライセンス
MIT © Salvatore
すべてのソースファイルは MIT ライセンスで公開されています。