Hugging Face Diffusers를 사용하여 Intel Sapphire Rapids CPUs에서 Stable Diffusion 미세 조정
Hugging Face는 다섯 개의 예시 이미지만 사용하여 텍스트 역전환을 통해 Intel Sapphire Rapids CPU에서 Stable Diffusion 모델을 미세 조정하는 방법을 보여주며, Intel Extension for PyTorch와 oneCCL을 통한 CPU 기반 미세 조정을 시연합니다.
클러스터 설정
네 개의 Intel Xeon Platinum 8480+ 서버는 각각 두 개의 Sapphire Rapids CPU를 갖추고 있으며, 분산 미세 조정을 위해 224개의 논리 코어(소켓당 56개의 물리 코어와 112개의 스레드)를 제공합니다. lscpu 출력은 아키텍처, 코어 수, 스레드 수, 그리고 AMX 명령어 세트의 존재를 확인합니다. 서버는 IP 주소 192.168.20.2, 192.168.21.2, 192.168.22.2, 192.168.23.2를 통해 접근되며, MPI용 nodefile에 나열되어 있습니다.
소프트웨어 환경 및 의존성
이 환경은 Python 3.9, PyTorch CPU 빌드, Transformers, Accelerate 버전 0.19.0, PyTorch용 oneCCL 바인딩, Intel Extension for PyTorch (IPEX), 그리고 tcmalloc을 위한 gperftools를 사용합니다. diffuser라는 이름의 conda 환경을 만든 후, pip와 conda를 통해 의존성을 설치합니다. Diffusers 저장소는 GitHub에서 클론되어 각 노드에서 소스에서 설치됩니다.
데이터 및 모델 코드 준비
다섯 개의 예시 이미지는 sd-concepts-library/dicoo 데이터셋에서 다운로드되어 모든 노드의 /home/devcloud/dicoo에 배치됩니다. 텍스트 역전환 스크립트(examples/textual_inversion/textual_inversion.py)는 intel_extension_for_pytorch를 가져오고, 훈련 데이터 타입(bf16)을 사용하여 U‑Net과 VAE 모델 दोनों에 ipex.optimize를 적용하도록 편집됩니다. 이 수정은 작업을 시작하기 전에 모든 노드에 적용해야 합니다.
분산 작업 구성
환경 변수는 주 노드에서 설정되어 워커에 전파됩니다: I_MPI_HYDRA_IFACE는 네트워크 인터페이스를 선택하고, oneccl_bindings_for_pytorch_path는 oneCCL 바인딩을 찾으며, LD_PRELOAD에는 OpenMP와 tcmalloc 라이브러리가 포함되고, CCL_ATL_TRANSPORT는 ofi로 설정되며, CCL_WORKER_COUNT는 1로 설정됩니다. 모델 이름은 runwayml/stable-diffusion-v1-5로 정의되고, 데이터 디렉터리는 /home/devcloud/dicoo입니다.
미세 조정 실행
미세 조정 작업은 mpirun -f nodefile -n 16 -ppn 4로 실행되어 16개의 MPI 랭크(노드당 4개)를 시작합니다. accelerate launch 명령은 다음 인수로 수정된 텍스트 역전환 스크립트를 실행합니다: --pretrained_model_name_or_path=$MODEL_NAME --train_data_dir=$DATA_DIR --learnable_property="object" --placeholder_token="<dicoo>" --initializer_token="toy" --resolution=512 --train_batch_size=1 --seed=7 --gradient_accumulation_steps=1 --max_train_steps=200 --learning_rate=2.0e-03 --scale_lr --lr_scheduler="constant" --lr_warmup_steps=0 --output_dir=./textual_inversion_output --mixed_precision bf16 --save_as_full_pipeline. 200단계 훈련은 바쁜 클러스터 스크린샷에서 나타낸 바와 같이 약 다섯 분 정도 소요됩니다.
분산 훈련 문제 해결
분산 작업이 실패하면 권장되는 접근 방식은 각 노드에 로그인하여 주 노드의 환경을 복제하고, 동일한 인수로 로컬에서 훈련 스크립트를 실행하는 것입니다. 로컬 실행이 성공하면 해당 노드의 의존성과 데이터 경로가 올바름을 나타내며, 그렇지 않으면 누락된 의존성 또는 잘못된 이미지 위치가 드러납니다. 모든 노드가 로컬에서 정상 작동함을 확인한 후, 주 노드로 돌아가서 nodefile, 환경 변수, 그리고 mpirun 명령을 다시 확인합니다.
미세 조정된 모델로 이미지 생성
훈련 후, 모델은 Optimum Intel과 OpenVINO를 사용하여 내보내고 최적화됩니다: OVStableDiffusionPipeline.from_pretrained(model_id, export=True) 다음에 ov_pipe.reshape(batch_size=5, height=512, width=512, num_images_per_prompt=1) 및 ov_pipe.save_pretrained가 이어집니다. 최적화된 파이프라인을 로드(OVStableDiffusionPipeline.from_pretrained(model_id, num_inference_steps=20))하고 `[