μ΄ νλ‘μ νΈλ κΈ°μ‘΄μ ν μ€νΈ ν둬ννΈ λμ , ν(Tabular) λ°μ΄ν°λ₯Ό μ λ ₯μΌλ‘ λ°μ μ΄λ―Έμ§λ₯Ό μμ±νλλ‘ μ€ν μ΄λΈ λν¨μ λͺ¨λΈμ νμΈνλν©λλ€. ν λ°μ΄ν°λ₯Ό μ²λ¦¬νκ³ λν¨μ λͺ¨λΈμ UNetμ 쑰건ννκΈ° μν΄ μ»€μ€ν μ κ²½λ§μ μ¬μ©ν©λλ€.
- ν λ°μ΄ν° μ λ ₯: μ«μ λλ λ²μ£Όν λ°μ΄ν°λ₯Ό κΈ°λ°μΌλ‘ μ΄λ―Έμ§λ₯Ό μμ±ν©λλ€.
- 컀μ€ν 쑰건ν: 컀μ€ν λ€νΈμν¬κ° ν μ λ ₯μ λν¨μ λͺ¨λΈμ μν μλ² λ©μΌλ‘ λ³νν©λλ€.
- μ€ν μ΄λΈ λν¨μ v1.5: λ리 μ¬μ©λλ κ°λ ₯ν μ€ν μ΄λΈ λν¨μ v1.5 λͺ¨λΈμ κΈ°λ°μΌλ‘ ν©λλ€.
- νΌν© μ λ°λ νμ΅ (Mixed Precision Training): λ©λͺ¨λ¦¬ ν¨μ¨μ±κ³Ό νμ΅ μλ ν₯μμ μν΄
float16λ°bfloat16νΌν© μ λ°λ νμ΅μ μ§μν©λλ€. - κ·ΈλΌλμΈνΈ ν΄λ¦¬ν (Gradient Clipping): νμ΅ μ€ κΈ°μΈκΈ° νλ°(Gradient Explosion)μ λ°©μ§νκΈ° μν ν΄λ¦¬ν κΈ°λ₯μ ꡬννμ΅λλ€.
- νμΈνλ: μλ‘μ΄ μ‘°κ±΄(Conditioning)μ μ΄ν΄νλλ‘ μ€ν μ΄λΈ λν¨μ νμ΄νλΌμΈμ UNet λΆλΆμ μμ ν©λλ€.
- κ°νΈν μ€μ : λͺ¨λ μ€ν, λͺ¨λΈ, νμ΅ νλΌλ―Έν°λ₯Ό
default.yamlνμΌ νλλ‘ κ΄λ¦¬ν©λλ€. - μ¦μ μ¬μ© κ°λ₯ν μ€ν¬λ¦½νΈ: νμ΅μ μν
train.pyμ νμ΅λ λͺ¨λΈλ‘ μ΄λ―Έμ§λ₯Ό μμ±νλinference.pyλ₯Ό ν¬ν¨ν©λλ€. - μ¬νμ±: 컨ν
μ΄λνλ νκ²½μ ꡬμΆνκΈ° μν
Dockerfileμ ν¬ν¨ν©λλ€.
- Python 3.8 μ΄μ
- PyTorch
- Git λ° Git LFS
-
리ν¬μ§ν 리 ν΄λ‘ :
git clone https://github.com/your-username/your-repo-name.git cd your-repo-name -
μμ‘΄μ± μ€μΉ:
pip install -r requirements.txt
-
μ¬μ νμ΅λ μ€ν μ΄λΈ λν¨μ v1.5 λ€μ΄λ‘λ: μ΄ νλ‘μ νΈλ μ€ν μ΄λΈ λν¨μ v1.5μ μλ³Έ κ°μ€μΉκ° νμν©λλ€. κ°μ€μΉλ₯Ό λ€μ΄λ‘λνμ¬ νΉμ λλ ν 리μ λ°°μΉν΄μΌ ν©λλ€.
default.yamlμ κΈ°λ³Έ μ€μ μ../../../weight_original/stable-diffusion-v1-5κ²½λ‘λ₯Ό μ¬μ©ν©λλ€.Hugging Face Hubμμ κ°μ€μΉλ₯Ό λ€μ΄λ‘λν μ μμ΅λλ€: stable-diffusion-v1-5
λͺ¨λΈ κ°μ€μΉλ₯Ό μ¬λ°λ₯΄κ² λ€μ΄λ‘λνλ €λ©΄
git-lfsκ° μ€μΉλμ΄ μμ΄μΌ ν©λλ€.
λ°μ΄ν° λ‘λλ data_example/sushi λλ ν 리μ κ°μ νΉμ ꡬ쑰μ λ°μ΄ν°μ
μ νμλ‘ ν©λλ€.
images/: λͺ¨λ μ΄λ―Έμ§ νμΌμ΄ ν¬ν¨λ ν΄λ.metadata.jsonl: κ° μ€μ΄file_nameκ³Όcustom_inputμ ν¬ν¨νλ λμ λλ¦¬μΈ JSON Lines νμΌ.
metadata.jsonl μμ:
{"file_name": "sushi_0.jpg", "custom_input": [1, 0, 0, 0, 0]}file_name:imagesν΄λμ μλ μ΄λ―Έμ§ νμΌμ μ΄λ¦.custom_input: ν λ°μ΄ν°λ₯Ό λνλ΄λ μ«μ 리μ€νΈ. μ΄ λ¦¬μ€νΈμ κΈΈμ΄λ μ€μ νμΌμmodel_custom.num_input_layerμ μΌμΉν΄μΌ ν©λλ€.
default.yaml νμΌμ data.path_datasetμ λΉμ μ λ°μ΄ν°μ
λλ ν 리 κ²½λ‘λ‘ μμ νμΈμ.
λͺ¨λ μ€μ μ default.yamlμ ν΅ν΄ μ μ΄λ©λλ€. μ£Όμ μ€μ νλΌλ―Έν°λ λ€μκ³Ό κ°μ΅λλ€.
experiment: μ€ν μ΄λ¦, μ μ₯ λλ ν 리, μλ(seed) μ€μ .model_custom:num_input_layer: ν λ°μ΄ν° μ λ ₯μ νΌμ²(feature) μ.path_sd: μ¬μ νμ΅λ μ€ν μ΄λΈ λν¨μ v1.5 κ°μ€μΉ κ²½λ‘.
train: μν¬ν¬, λ°°μΉ ν¬κΈ°, νμ΅λ₯ λ± νμ΅ κ΄λ ¨ νλΌλ―Έν°.dtype: νμ΅ λ°μ΄ν° νμ μ λλ€."float32","float16","bfloat16"μ μ§μν©λλ€."float16"λλ"bfloat16"μΌλ‘ μ€μ νκ³ CUDA νκ²½μΈ κ²½μ° μλμΌλ‘ νΌν© μ λ°λ νμ΅μ΄ νμ±νλ©λλ€.
data:path_dataset: λ°μ΄ν°μ λλ ν 리 κ²½λ‘.
λͺ¨λΈ νμ΅μ μμνλ €λ©΄ train.py μ€ν¬λ¦½νΈλ₯Ό μ€ννμΈμ. μ΄ μ€ν¬λ¦½νΈλ λ€μμ μνν©λλ€.
default.yamlμμ μ€μ μ λΆλ¬μ΅λλ€.exp_resultsμλμ νμμ€ν¬νκ° ν¬ν¨λ μ€ν λλ ν 리λ₯Ό μμ±ν©λλ€.- μ¬νμ±μ μν΄ μ€μ νμΌκ³Ό μ½λ μ€λ μ·μ μ μ₯ν©λλ€.
- νμ΅ νλ‘μΈμ€λ₯Ό μμν©λλ€.
python train.py체ν¬ν¬μΈνΈμ μ΅μ λͺ¨λΈμ μ€ν λλ ν 리(μ: ../../../exp_results/YYYYMMDD_HHMMSS_exp)μ μ μ₯λ©λλ€.
νμ΅μ΄ μλ£λ ν, inference.pyλ₯Ό μ¬μ©νμ¬ μ΄λ―Έμ§λ₯Ό μμ±ν μ μμ΅λλ€.
-
λͺ¨λΈ κ²½λ‘ μ€μ :
inference.pyνμΌμ μ΄κ³path_inferλ³μλ₯Ό λΉμ μ μ€ν λλ ν 리 κ²½λ‘λ‘ μμ ν©λλ€.# inference.pyμμ path_infer = "../../../exp_results/your_experiment_timestamp_exp"
-
μ λ ₯ λ°μ΄ν° μ 곡:
list_valuesλ³μλ₯Ό μ΄λ―Έμ§λ‘ μμ±νλ €λ ν λ°μ΄ν°λ‘ μμ ν©λλ€. μ λ ₯μ 곡백μΌλ‘ ꡬλΆλ μ«μ λ¬Έμμ΄μ΄μ΄μΌ ν©λλ€.# inference.pyμμ values_input_0 = "0 1 0 0 1" values_input_1 = "1 0 0 0 0" list_values = [values_input_0, values_input_1]
-
μ€ν¬λ¦½νΈ μ€ν:
python inference.py
μμ±λ μ΄λ―Έμ§λ img_gen λλ ν 리μ μ μ₯λ©λλ€.