Style-96
세부 정보
파일 다운로드
이 버전에 대해
모델 설명
최종-2 (업데이트, 원본 스토리는 아래 참조)
"final"이라는 이름을 붙일 때는 결코 마지막 버전이 아니라는 걸 알죠 :D
@Neural_Lens의 훌륭한 의견 덕분에 훈련을 다시 수행하고 대안 병합을 해보았습니다.
먼저, 학습률(LR)을 낮추고 에포크 수를 더 늘렸으며, 고전적인 코사인 및 Prodigy 최적화기로 되돌아갔습니다. 또한 차원을 줄였습니다(16)만, 값 변화에 더 큰 영향을 주기 위해 더 낮은 알파(4)를 선택했습니다.
{
"engine": "kohya",
"unetLR": 0.0001,
"clipSkip": 2,
"loraType": "lora",
"keepTokens": 0,
"networkDim": 16,
"numRepeats": 2,
"resolution": 1024,
"lrScheduler": "cosine",
"minSnrGamma": 0,
"noiseOffset": 0.03,
"targetSteps": 2400,
"enableBucket": true,
"networkAlpha": 4,
"optimizerType": "Prodigy",
"textEncoderLR": 0,
"maxTrainEpochs": 20,
"shuffleCaption": true,
"trainBatchSize": 4,
"flipAugmentation": false,
"lrSchedulerNumCycles": 1
}
또한, 훈련에 Neural Lens Core 를 활용했습니다. 이 모델은 훈련에 완벽한 Illustrious 모델처럼 느껴졌으며, 기본 Illustrious V0.1이나 임의의 WAI 반복보다 훨씬 나았습니다.
몇 번의 테스트 끝에 몇 개의 에포크를 선택했습니다:

그리고 TIES와 DARE가 작동하는지 확인하기 위해 새로운 병합을 수행했습니다:
from safetensors.torch import save_file
import sd_mecha as sdm
sdm.set_log_level()
base = sdm.model("test3-000010.safetensors")
models = [
sdm.model("test3-000012.safetensors"),
sdm.model("test3-000018.safetensors"),
sdm.model("test3-000019.safetensors"),
]
recipe_dare = sdm.ties_with_dare(base,*models,probability=0.6,seed=42,alpha=0.5)
test = sdm.merge(recipe_dare,output_device="cpu")
for k in [ k for k in test.keys() if "lora_te" in k ]:
del(test[k])
save_file(test,"test3-dare.safetensors")
이 시점에서 병합을 진행할 때 Prodigy가 TE의 LR을 0으로 설정한 것을 무시한다는 것을 알게 되었기 때문에, TE 레이어를 제거했습니다.
어쨌든, 이 방식은 다르게 작동하며 매우 좋습니다. 둘 중 어떤 것을 선택할지 고민된다면 그냥 둘을 함께 붙이면 됩니다 :D
처음이자 마지막
간단한 테스트입니다. 목표는 눈과 입의 특정 스타일을 재현하는 것이었습니다. LoRA 조합을 찾은 후, 무작위로 1girl 이미지(60장)를 생성하고 자동 태깅을 수행한 뒤, 몇 분간 블루 버즈를 소모하기 위해 빠른 훈련을 시작했습니다.
훈련 파라미터:
{
"engine": "kohya",
"unetLR": 0.0005,
"clipSkip": 2,
"loraType": "lora",
"keepTokens": 0,
"networkDim": 32,
"numRepeats": 2,
"resolution": 1024,
"lrScheduler": "cosine_with_restarts",
"minSnrGamma": 0,
"noiseOffset": 0.03,
"targetSteps": 1440,
"enableBucket": true,
"networkAlpha": 32,
"optimizerType": "Adafactor",
"textEncoderLR": 0,
"maxTrainEpochs": 12,
"shuffleCaption": false,
"trainBatchSize": 1,
"flipAugmentation": false,
"lrSchedulerNumCycles": 3
}
특별한 건 없습니다(PS: 제가 알고 있지만, 이 파라미터들이 최고는 아니며, 테스트 중이었죠 :D)
두 개의 아름다운 에포크 7과 9를 선택했습니다. 이 포스팅을 하는 이유는, 저는 종종 LoRA 훈련 에포크를 병합하기 때문입니다.
흔히 하지 않는 방법이지만, 저는 보통 수동으로 병합해왔고, 이번에는 재현 가능한 방법을 테스트해보았습니다:
>>> import sd_mecha as sdm
>>> sdm.set_log_level()
>>> a = sdm.model("test-000007.safetensors")
>>> b = sdm.model("test-000009.safetensors")
>>> c = sdm.slerp(a,b)
>>> sdm.merge(c,output="test-slerp.safetensors")
어쨌든, 여기까지입니다. :D
기본 아이디어(소스 LoRA): https://civitai.com/images/109655271
이 LoRA는 PrefectIllustrious V3에서 훈련되었습니다.










