優れたソフトウェアと実用的なチュートリアル
Amazon Web Services 公式サイト:https://www.amazonaws.cn
Amazonクラウド海外公式サイト:https://aws.amazon.com/cn/
それらの違いはおおよそ次のようになります。

DreamBoothアルゴリズムはImagenモデルを微調整し、画像内の実在物体を忠実に復元する機能を実現します。少数の実在物体画像を微調整することで、元のSDモデルは画像エンティティの記憶の忠実性を維持し、元の画像内のエンティティの主要な特徴やテーマスタイルまでもテキストに認識します。これは、ユーザー固有の画像生成ニーズに合わせて調整可能な、新しいテキストから画像への「パーソナライズされた」(つまり、ユーザー固有の画像生成ニーズに適応可能な)拡散モデルです。

現在、DreamBooth を微調整するには主に 2 つの方法があります。
以下では、BYOC トレーニングジョブを使用して Amazon SageMaker で Dreambooth の微調整を実行し、Dreambooth トレーニングプロセスのメモリオーバーヘッド、モデル管理、ハイパーパラメータを最適化する方法について詳しく説明します。これにより、ユーザーは独自の ML プラットフォームまたはビジネスシステムにエンジニアリングを実装し、トレーニングの全体的な TCO を削減できます。
model_dir='/opt/ml/input/fineturned_model/' モデル = StableDiffusionPipeline.from_pretrained( model_dir, スケジューラ = DPMSolverMultistepScheduler.from_pretrained(model_dir, サブフォルダ="scheduler"), torch_dtype=torch.float16, )
images_s3uri = 's3://{0}/drebooth/images/'.format(bucket) inputs = { 'images': images_s3uri } estimator = Estimator( role = role, instance_count=1, instance_type = instance_type, image_uri = image_uri, hyperparameters = hyperparameters, environment = environment ) estimator.fit(inputs)

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 noninteractive RUN apt-get update RUN apt-get install --assume-yes apt-utils -y RUN apt update 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 export TORCH_CUDA_ARCH_LIST="7.5 8.0 8.6" && export 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 requirements.txt && pip install -e . ENTRYPOINT []
algorithm_name=dreambooth-finetuning-v3 account=$(aws sts get-caller-identity --query Account --output text) # 現在の設定で定義されているリージョンを取得します (定義されていない場合はデフォルトで us-west-2 になります)。region=$(aws configure getregion) fullname="${account}.dkr.ecr.${region}.amazonaws.com/${algorithm_name}:latest" # ECR にリポジトリが存在しない場合は作成します。 aws ecr describe-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 # イメージ名を使用して Docker イメージをローカルにビルドし、完全な名前で 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 tag ${algorithm_name} ${fullname} docker push ${fullname} rm -rf ./sd_code
githubの関連情報:
github 上の sd_extentions のコード:
https://github.com/d8ahazard/sd_dreambooth_extension
前述のように、SD WebUI はバックエンドの業務システムと統合できないため、WebUI プラグイン モードから分離し、基本モデル、入力画像、インスタンス プロンプト、クラス プロンプト、微調整されたモデル出力などの標準入力に基づいて、別のモデル トレーニング プログラムにカプセル化する必要があります。
shared.force_cpuの場合: modules.sharedをインポートします。no_safe = modules.shared.cmd_opts.disable_safe_unpickle modules.shared.cmd_opts.disable_safe_unpickle = True
helpers.mytqdm から mytqdm をインポートします
クリーンアップされたsd_extentionsコードはhttps://github.com/qingyuan18/sd_dreambooth_extension.gitで確認できます。コアとなるtrainモジュールのみが保持され、webui.py、helper、shardといったフロントエンドの連携関連コードはクリーンアップされていることがわかります。
ハイパーパラメータ = { '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': instance_prompt, ……} 推定器 = Estimator( ロール = role, インスタンス数 = 1, インスタンスタイプ = インスタンスタイプ, イメージ uri = image_uri, ハイパーパラメータ = ハイパーパラメータ )
お客様の本番環境にckpt形式のモデルファイルが1つだけ存在する場合(civit.aiサイトからダウンロードしたモデルなど)、diffuserが提供する変換スクリプトを使用してckpt形式からdiffuserディレクトリ形式に変換することで、本番環境に同じコードをロードできます。スクリプトの使用例は以下の通りです。
Python convert_original_stable_diffusion_to_diffusers.py —チェックポイントパス ./models_ckpt/768-v-ema.ckpt —ダンプパス ./models_diffuser


そのため、manul_upload_model_pathパラメータを追加し、トレーニング済みモデルファイルを手動でアップロードするS3パスを指定します。トレーニングが完了すると、モデルディレクトリ全体が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) for root, dirs, files in os.walk(local_directory): for filename in files: 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} が s3://{bucket}/{s3_path} にアップロードされました') for subdir in dirs: upload_directory_to_s3(local_directory+"/"+subdir,dest_s3_path+"/"+subdir) s_pipeline.save_pretrained(args.models_path) ### トレーニング済みの DB モデル ディレクトリを手動で s3 にアップロードします。path##### #### sagemaker tar プロセスを削除するため。##### 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モデルは16GBのビデオメモリを搭載したNVIDIA T4グラフィックカードを1枚しか搭載していません。Dreamboothは、unetネットワークとvaeネットワークを再学習させ、以前の損失重みを保持する必要があります。より忠実度の高いDreamboothの微調整が必要な場合、入力データは数十枚にもなり、学習プロセスは1000ステップにもなります。ネットワーク全体、特にunetネットワークのグラフィックスノイズ除去とノイズ除去は、ビデオメモリのオーバーヘッド(OOM)を引き起こしやすく、学習タスクの失敗につながる可能性があります。
Dreamboothモデルを16GBのビデオメモリを搭載したコスト効率の高いマシンでトレーニングできるよう、複数の最適化を行いました。その結果、SageMakerでのDreamboothの微調整にはG4dn.xlargeマシンのみが必要となり、トレーニングは数百から3,000ステップで完了するため、お客様のDreamboothトレーニングコストを大幅に削減できます。
コード例は次のとおりです。
print(f"合計VRAM: {gb}") 24 > gb >= 16の場合: attention = "xformers" not_cache_latents = False train_text_encoder = True use_ema = True 16 > gb >= 10の場合: train_text_encoder = False use_ema = False gbの場合 < 10: use_cpu = True use_8bit_adam = False mixing_precision = 'no'
Dreamboothのトレーニング中、デフォルトのフラッシュメモリからxformersに注視が切り替わります。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 1回あたりに処理する画像数。インスタンス画像やクラス画像の数が少ない場合(10枚未満)は、この値を1に設定することで、バッチ処理する画像数を減らし、ビデオメモリの使用量を減らすことができます。
- 'sample_batch_size': 1 は train_batch_size に相当し、サンプリング、ノイズ除去、ノイズ除去を一度に行うバッチスループットです。この値を下げると、ビデオメモリの使用量も削減されます。
- not_cache_latents さらに、Stable Diffusionの学習は潜在拡散モデルに基づいています。元のモデルは潜在拡散をキャッシュしますが、ここでは主にインスタンスプロンプトとクラスプロンプトの下で正則化を学習します。そのため、GPUビデオメモリが逼迫している場合は、潜在拡散をキャッシュしないことでビデオメモリの使用量を最小限に抑えることができます。
- 'gradient_accumulation_steps' 勾配更新のバッチ。トレーニングステップが1000など大きい場合は、勾配更新のステップ数を増やし、一定のバッチまで累積した後に一括更新することができます。値が大きいほど、ビデオメモリの使用量が増加します。ビデオメモリを削減したい場合は、トレーニング時間を多少犠牲にしてこの値を減らすことができます。テキストエンコーダtext_encodeの再トレーニングを選択した場合、勾配累積はサポートされておらず、マルチGPUマシンで加速マルチカード分散トレーニングが有効になっている場合、バッチ勾配更新gradient_accumulation_stepsは1にのみ設定できます。それ以外の場合、テキストエンコーダの再トレーニングは無効になります。

# はトリガーワードとして zwx を使用します。モデルをトレーニングした後、この単語を使用してグラフを生成しますinstance_prompt="photo\ of\ zwx\ toy" class_prompt="photo\ of\ a\ cat toy" #ノートブックトレーニングコードの説明#ハイパーパラメータを設定しますenvironment = { 'PYTORCH_CUDA_ALLOC_CONF':'max_split_size_mb:32', 'LD_LIBRARY_PATH':"${LD_LIBRARY_PATH}:/opt/conda/lib/" } 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/', 'instance_prompt': instance_prompt, 'class_prompt':class_prompt, 'resolution':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 } hyperparameters = json_encode_hyperparameters(hyperparameters) # は、sagemaker.estimator から Sagemaker トレーニング ジョブを開始します。import Estimator inputs = { 'images': f"s3://{bucket}/dreambooth/images/" } estimator = Estimator( role = role、instance_count=1、instance_type = instance_type、image_uri = image_uri、hyperparameters = hyperparameters、environment = environment ) estimator.fit(inputs)





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
Huggingface ディフューザー形式変換ツール:
https://github.com/huggingface/diffusers/tree/main/scripts
安定した拡散 WebUI Dreambooth 拡張プラグイン:
https://github.com/d8ahazard/sd_dreambooth_extension.git
フェイスブック xformers オープンソース: