아마존클라우드 기술 공식 웹사이트:https://www.amazonaws.cn
이들의 차이점은 대략 다음과 같습니다.
DreamBooth 알고리즘은 Imagen 모델을 미세 조정하여 이미지의 실제 객체를 실제로 복원하는 기능을 달성합니다. 소수의 물리적 객체 이미지를 미세 조정함으로써 원본 SD 모델은 이미지 엔터티 메모리에 대한 충실도를 유지하고 텍스트를 식별할 수 있습니다. 엔터티의 주요 특징과 원본 이미지의 테마 스타일까지 새로운 텍스트 대 이미지 "개인화"(사용자의 특정 이미지 생성 요구 사항에 맞게 조정할 수 있음) 확산 모델입니다.
현재 업계에서는 DreamBooth를 미세 조정하는 두 가지 주요 방법이 있습니다.
다음은 BYOC 모드 훈련 작업을 사용하여 Amazon SageMaker에서 Dreambooth 미세 조정을 수행하는 방법을 자세히 설명하고 Dreambooth 훈련 프로세스의 메모리 오버헤드, 모델 관리, 슈퍼 매개변수 등을 최적화하여 사용자가 미세 조정을 할 수 있도록 합니다. Dreambooth를 자체적으로 조정하고 ML 플랫폼 또는 비즈니스 시스템의 엔지니어링을 구현하고 교육의 전체 TCO를 줄입니다.
model_dir='/opt/ml/input/fineturned_model/' 모델 = StableDiffusionPipeline.from_pretrained( model_dir, Scheduler = DPMSolverMultistepScheduler.from_pretrained(model_dir, subfolder="scheduler"), torch_dtype=torch.float16, )
Images_s3uri = 's3://{0}/drebooth/images/'.format(bucket) inputs = { 'images': Images_s3uri } estimator = Estimator( 역할 = 역할, 인스턴스_count=1, 인스턴스_유형 = 인스턴스_유형, image_uri = 이미지_uri, 하이퍼파라미터 = 하이퍼파라미터, 환경 = 환경 ) estimator.fit(입력)
Amazon G4dn 및 G5에서 Xformers를 컴파일하고 설치하려면 cuda 11.7, torch 1.13 이상이 필요하며 CUDA_ARCH_LIST 컴퓨팅 성능 매개변수는 8.0 이상으로 설정되어야 합니다. 그렇지 않으면 컴파일 시 이 유형의 컴퓨팅 성능이 보고됩니다. GPU는 지원되지 않습니다.
컴파일 및 패키징됨 도커 파일 참조는 다음과 같습니다.
FROM pytorch/pytorch:1.13.0-cuda11.6-cudnn8-runtime ENV PATH="/opt/ml/code:${PATH}" ENV DEBIAN_FRONTEND 비대화형 RUN apt-get 업데이트 RUN apt-get install --assume-yes apt-utils -y RUN apt 업데이트 RUN echo "Y"|apt install vim RUN apt install wget git -y RUN apt install libgl1-mesa-glx -y RUN pip install opencv-python-headless RUN mkdir -p /opt/ml /code RUN pip3 install sagemaker-training COPY train.py /opt/ml/code/ COPY ./sd_code/ /opt/ml/code/ RUN pip install -r /opt/ml/code/extensions/sd_dreambooth_extension/requirements.txt ENV SAGEMAKER_PROGRAM train.py RUN 내보내기 TORCH_CUDA_ARCH_LIST="7.5 8.0 8.6" && 내보내기 FORCE_CUDA="1" && pip install ninja triton==2.0.0.dev20221120 && git clone https://github.com/xieyongliang/xformers.git / opt/ml/code/repositories/xformers && cd /opt/ml/code/repositories/xformers && git submodule update --init --recursive && pip install -r 요구 사항.txt && pip install -e .ENTRYPOINT []
알고리듬_이름=dreambooth-finetuning-v3 계정=$(aws sts get-caller-identity --query Account --output text) # 현재 구성에 정의된 지역 가져오기(정의되지 않은 경우 기본값은 us-west-2) 지역= $(awsconfiguregetregion) fullname="${account}.dkr.ecr.${region}.amazonaws.com/${algorithm_name}:latest" # ECR에 리포지토리가 없으면 생성합니다. aws ecr explain-repositories --repository-names "${algorithm_name}" > /dev/null 2>&1 if [ $? -ne 0 ] then aws ecr create-repository --repository-name "${algorithm_name}" > / dev/null fi # Docker pwd=$(aws ecr get-login-password --region ${region})에 로그인 docker login --username AWS -p ${pwd} ${account}.dkr.ecr.${ Region}.amazonaws.com # 이미지 이름을 사용하여 로컬에서 도커 이미지를 빌드한 다음 전체 이름을 사용하여 ECR #에 푸시합니다. mkdir -p ./sd_code/extensions cd ./sd_code/extensions/ && git clone https:// github.com/qingyuan18/sd_dreambooth_extension.git cd ../../ docker build -t ${algorithm_name} ./ -f ./dockerfile_v3 > ./docker_build.log docker 태그 ${algorithm_name} ${fullname} docker push $ {전체 이름}rm -rf ./sd_code
github 관련 정보:
github의 sd_extensions 코드:
https://github.com/d8ahazard/sd_dreambooth_extension
위에서 언급했듯이 SD WebUI는 백엔드 비즈니스 시스템과 통합될 수 없기 때문에 WebUI 플러그인 모드와 분리하여 기본 모델, 입력 이미지, 인스턴스 프롬프트 등 표준 입력을 기반으로 독립적으로 캡슐화해야 합니다. 클래스 프롬프트 등을 미세 조정한 후 모델 출력을 별도의 모델 훈련 프로그램으로 만듭니다.
shared.force_cpu인 경우: import module.shared no_safe = module.shared.cmd_opts.disable_safe_unpickle module.shared.cmd_opts.disable_safe_unpickle = True
helpers.mytqdm에서 mytqdm 가져오기
정리된 sd_extentions 코드는 https://github.com/qingyuan18/sd_dreambooth_extension.git에서 확인할 수 있으며, 코어트레인 트레이닝 모듈만 유지되고 webui.py, helper 등의 프론트엔드 커플링 관련 코드가 남아있는 것을 볼 수 있습니다. 및 샤드가 정리되었습니다.
hyperparameters = { 'model_name':'aws-trained-dreambooth-model', 'mixed_precision':'fp16', 'pretrained_model_name_or_path': model_name, 'instance_data_dir':instance_dir, 'class_data_dir':class_dir, 'with_prior_preservation':True, ' models_path': '/opt/ml/model/', 'manul_upload_model_path':s3_model_output_location, 'instance_prompt': 인스턴스_프롬프트, …} 추정기 = 추정기( 역할 = 역할, 인스턴스_카운트=1, 인스턴스_유형 = 인스턴스_유형, 이미지_uri = 이미지_uri, 하이퍼파라미터 = 하이퍼파라미터)
고객이 프로덕션 환경에 있는 경우 ckpt 형식의 단일 모델 파일입니다(예: civit.일체 포함 사이트에서 다운로드한 모델), 이후 디퓨저에서 공식적으로 제공하는 변환 스크립트를 통해 ckpt 형식에서 디퓨저 디렉토리 형식으로 변환하면 프로덕션 환경에서도 동일한 코드가 로딩될 수 있다.스크립트 사용 예는 다음과 같다. :
파이썬 Convert_original_stable_diffusion_to_diffusers.py —checkpoint_path ./models_ckpt/768-v-ema.ckpt —dump_path ./models_diffuser
따라서 훈련된 모델 파일이 수동으로 업로드되는 S3 경로를 지정하기 위해 manul_upload_model_path 매개변수를 추가합니다.훈련 후에는 전체 모델 디렉터리가 S3 SDK를 통해 지정된 S3에 재귀적으로 업로드되므로 SageMaker는 더 이상 model.tar를 패키징하지 않습니다. gz.
참조 코드 예시는 다음과 같습니다.
def upload_directory_to_s3(local_directory, dest_s3_path): bucket,s3_prefix=get_bucket_and_key(dest_s3_path) 루트, 디렉터리, os.walk의 파일(local_directory): 파일의 파일 이름: local_path = os.path.join(root, filename)relative_path = os .path.relpath(local_path, local_directory) s3_path = os.path.join(s3_prefix,relative_path).replace("\\", "/") s3_client.upload_file(local_path, bucket, s3_path) print(f'파일 {local_path } dirs의 하위 디렉터리에 대해 s3://{bucket}/{s3_path}')에 업로드됨: upload_directory_to_s3(local_directory+"/"+subdir,dest_s3_path+"/"+subdir) s_pipeline.save_pretrained(args.models_path) ### 훈련된 DB를 수동으로 업로드 Sagemaker tar process##### print(f"manul_upload_model_path is {args.manul_upload_model_path}") upload_directory_to_s3(args.models_path,args. manul_upload_model_path)
그러나 g4dn 모델에는 16G 비디오 메모리를 갖춘 단일 NVIDIA T4 그래픽 카드만 있습니다. Dreambooth는 이전 손실 가중치를 유지하기 위해 unet 및 vae 네트워크를 재교육해야 합니다. 더 높은 충실도의 Dreambooth 미세 조정이 필요한 경우 최대 수십 개의 이미지가 데이터, 1000단계 훈련 과정, 전체 네트워크, 특히 unet 네트워크의 그래픽 노이즈 및 노이즈 감소 처리는 쉽게 메모리 OOM을 발생시켜 훈련 작업이 실패할 수 있습니다.
고객이 16G 비디오 메모리를 갖춘 비용 효율적인 모델에서 Dreambooth 모델을 교육할 수 있도록 이러한 최적화를 수행하여 Dreambooth 미세 조정에는 수백 ~ 3000개의 교육 단계가 포함된 SageMaker의 G4dn.xlarge 모델만 필요합니다. 완료되므로 고객을 위한 Dreambooth 교육 비용이 크게 절감됩니다.
코드 예시는 다음과 같습니다.
print(f"총 VRAM: {gb}") 24 > gb >= 16인 경우: attention = "xformers" not_cache_latents = False train_text_encoder = True use_ema = 16 > gb >= 10인 경우 True: train_text_encoder = False use_ema = gb인 경우 False < 10: use_cpu = 참 use_8bit_adam = 거짓 혼합_정밀도 = '아니요'
Dreambooth 훈련 과정에서 기본 플래시에서 xformer로 주의가 바뀌었는데, xformers를 켜기 전과 후의 GPU 메모리 상황을 비교해 보면 이 방법이 메모리 사용량을 크게 줄여주는 것을 알 수 있습니다.
Xformers를 시작하기 전에:
***** 훈련 실행 ***** 장치당 순간 배치 크기 = 1 총 훈련 배치 크기(병렬, 분산 및 누적 포함) = 1 기울기 누적 단계 = 1 총 최적화 단계 = 1000 훈련 설정: CPU: False Adam: True, Prec: fp16, Grad: True, TextTr: False EM: True, LR: 2e-06 LORA:False 할당: 10.5GB 예약됨: 11.7GB
***** 훈련 실행 ***** 장치당 순간 배치 크기 = 1 총 훈련 배치 크기(병렬, 분산 및 누적 포함) = 1 기울기 누적 단계 = 1 총 최적화 단계 = 1000 훈련 설정: CPU: False Adam: True, Prec: fp16, Grad: True, TextTr: False EM: True, LR: 2e-06 LORA:False 할당: 5.5GB 예약됨: 5.6GB
- 'PYTORCH_CUDA_ALLOC_CONF':'max_split_size_mb:32'메모리 조각화로 인해 발생한 CUDA OOM의 경우 PYTORCH_CUDA_ALLOC_CONF의 max_split_size_mb를 더 작은 값으로 설정할 수 있습니다.
- train_batch_size':1 매번 처리되는 이미지 수 인스턴스 이미지나 클래스 이미지가 많지 않은 경우(10개 미만) 이 값을 1로 설정하면 일괄 처리되는 이미지 수를 줄여 사용량을 줄일 수 있습니다. 비디오 메모리를 어느 정도..
- 'sample_batch_size': 1은 샘플링 노이즈 추가와 노이즈 감소를 동시에 수행하는 일괄 처리량인 train_batch_size에 해당하며, 이 값을 낮추면 비디오 메모리 사용량도 줄어듭니다.
- not_cache_latents 또한 Stable Diffusion의 훈련은 Latent Diffusion Models를 기반으로 합니다. 원래 모델은 잠재성을 캐시하며 우리는 주로 인스턴스 프롬프트와 클래스 프롬프트에서 정규화를 훈련합니다. 따라서 GPU 메모리가 부족할 경우 캐시하지 않도록 선택할 수 있습니다. 잠재성 메모리 사용량을 최소화합니다.
- 'gradient_accumulation_steps'는 그래디언트 업데이트 배치이며, 트레이닝 단계가 1000과 같이 큰 경우 그래디언트 업데이트 단계 수를 늘려서 특정 배치로 누적한 후 한꺼번에 업데이트할 수 있습니다. 값이 클수록 메모리 사용량이 높아집니다. 비디오 메모리를 줄이려는 경우 훈련 시간의 일부를 희생하여 이 값을 줄일 수 있습니다. 그라디언트 누적을 지원하지 않는 텍스트 인코더 text_encode를 재교육하기로 선택하고 다중 GPU 시스템에서 가속의 멀티 카드 분산 교육이 활성화된 경우 일괄 그라디언트 업데이트gradient_accumulation_steps는 1로만 설정할 수 있습니다. 그렇지 않으면 텍스트 인코더가 다시 학습되고 비활성화됩니다.
#는 zwx를 트리거 단어로 사용합니다. 모델이 훈련된 후 이 단어를 사용하여 이미지를 생성합니다. 슈퍼 매개변수 설정하기 환경 = { 'PYTORCH_CUDA_ALLOC_CONF':'max_split_size_mb:32', 'LD_LIBRARY_PATH':"${LD_LIBRARY_PATH}:/opt/conda/lib/" } 하이퍼파라미터 = { 'model_name':'aws-trained-dreambooth-model ', 'mixed_precision':'fp16', 'pretrained_model_name_or_path': model_name, 'instance_data_dir':instance_dir, 'class_data_dir':class_dir, 'with_prior_preservation':True, 'models_path': '/opt/ml/model/', 'instance_prompt ': 인스턴스_프롬프트 , 'class_prompt':class_prompt, '해결책':512, 'train_batch_size':1, 'sample_batch_size': 1, 'gradient_accumulation_steps':1, 'learning_rate':2e-06, 'lr_scheduler':'constant', 'lr_warmup_steps':0, 'num_class_images':50, 'max_train_steps':300, 'save_steps':100, 'attention':'xformers', 'prior_loss_weight': 0.5, 'use_ema':True, 'train_text_encoder':False, 'not_cache_latents' :True, 'gradient_checkpointing':True, 'save_use_epochs': False, 'use_8bit_adam': False } 하이퍼파라미터 = json_encode_hyperparameters(하이퍼파라미터) #는 sagemaker.estimator에서 Sagemaker 훈련 작업을 시작합니다. import Estimator inputs = { 'images': f" s3:/ /{bucket}/drebooth/images/" } 추정기 = 추정기( 역할 = 역할, 인스턴스_수=1, 인스턴스_유형 = 인스턴스_유형, 이미지_uri = 이미지_uri, 하이퍼파라미터 = 하이퍼파라미터, 환경 = 환경 ) 추정기.fit(입력)
https://github.com/aws-samples/sagemaker-stablediffusion-quick-kit
Stable Diffusion Quick Kit Dreambooth 미세 조정 문서:
드림부스 논문:
Dreambooth 원본 오픈 소스 github: https://colab.research.google.com/github/huggingface/notebooks/blob/main/diffusers/sd_dreambooth_training.ipynb#scrollTo=rscg285SBh4M
허깅페이스 디퓨저 형식 변환 도구:
https://github.com/huggingface/diffusers/tree/main/scripts
안정적인 확산 webui dreambooth 확장 플러그인:
https://github.com/d8ahazard/sd_dreambooth_extension.git
페이스북 Xformers 오픈 소스: