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에서 훈련되었습니다.

이 모델로 만든 이미지

이미지를 찾을 수 없습니다.