Pemecahan Masalah Paralel Model - Amazon SageMaker

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Pemecahan Masalah Paralel Model

Jika Anda mengalami kesalahan, Anda dapat menggunakan daftar berikut untuk mencoba memecahkan masalah pekerjaan pelatihan Anda. Jika masalah berlanjut, hubungi AWS Support.

Pertimbangan untuk Menggunakan SageMaker Debugger dengan Model Parallelism Library SageMaker

SageMaker Debugger tidak tersedia untuk pustaka SageMaker paralelisme model. Debugger diaktifkan secara default untuk semua pekerjaan SageMaker TensorFlow dan PyTorch pelatihan, dan Anda mungkin melihat kesalahan yang terlihat seperti berikut:

FileNotFoundError: [Errno 2] No such file or directory: '/opt/ml/checkpoints/metadata.json.sagemaker-uploading

Untuk memperbaiki masalah ini, nonaktifkan Debugger dengan meneruskan debugger_hook_config=False saat membuat kerangka kerja estimator seperti yang ditunjukkan pada contoh berikut.

bucket=sagemaker.Session().default_bucket() base_job_name="sagemaker-checkpoint-test" checkpoint_in_bucket="checkpoints" # The S3 URI to store the checkpoints checkpoint_s3_bucket="s3://{}/{}/{}".format(bucket, base_job_name, checkpoint_in_bucket) estimator = TensorFlow( ... distribution={"smdistributed": {"modelparallel": { "enabled": True }}}, checkpoint_s3_uri=checkpoint_s3_bucket, checkpoint_local_path="/opt/ml/checkpoints", debugger_hook_config=False )

Menyimpan Pos Pemeriksaan

Anda mungkin mengalami kesalahan berikut saat menyimpan pos pemeriksaan model besar di SageMaker:

InternalServerError: We encountered an internal error. Please try again

Ini bisa disebabkan oleh SageMaker batasan saat mengunggah pos pemeriksaan lokal ke Amazon S3 selama pelatihan. Untuk menonaktifkan pos pemeriksaan SageMaker, gunakan contoh berikut untuk mengunggah pos pemeriksaan secara eksplisit.

Jika Anda mengalami kesalahan sebelumnya, jangan gunakan checkpoint_s3_uri dengan panggilan. SageMaker estimator Saat menyimpan pos pemeriksaan untuk model yang lebih besar, kami sarankan untuk menyimpan pos pemeriksaan ke direktori khusus dan meneruskan yang sama ke fungsi pembantu (sebagai local_path argumen).

import os def aws_s3_sync(source, destination): """aws s3 sync in quiet mode and time profile""" import time, subprocess cmd = ["aws", "s3", "sync", "--quiet", source, destination] print(f"Syncing files from {source} to {destination}") start_time = time.time() p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) p.wait() end_time = time.time() print("Time Taken to Sync: ", (end_time-start_time)) return def sync_local_checkpoints_to_s3(local_path="/opt/ml/checkpoints", s3_uri=os.path.dirname(os.path.dirname(os.getenv('SM_MODULE_DIR', '')))+'/checkpoints'): """ sample function to sync checkpoints from local path to s3 """ import boto3 #check if local path exists if not os.path.exists(local_path): raise RuntimeError("Provided local path {local_path} does not exist. Please check") #check if s3 bucket exists s3 = boto3.resource('s3') if not s3_uri.startswith("s3://"): raise ValueError(f"Provided s3 uri {s3_uri} is not valid.") s3_bucket = s3_uri.replace('s3://','').split('/')[0] print(f"S3 Bucket: {s3_bucket}") try: s3.meta.client.head_bucket(Bucket=s3_bucket) except Exception as e: raise e aws_s3_sync(local_path, s3_uri) return def sync_s3_checkpoints_to_local(local_path="/opt/ml/checkpoints", s3_uri=os.path.dirname(os.path.dirname(os.getenv('SM_MODULE_DIR', '')))+'/checkpoints'): """ sample function to sync checkpoints from s3 to local path """ import boto3 #try to create local path if it does not exist if not os.path.exists(local_path): print(f"Provided local path {local_path} does not exist. Creating...") try: os.makedirs(local_path) except Exception as e: raise RuntimeError(f"Failed to create {local_path}") #check if s3 bucket exists s3 = boto3.resource('s3') if not s3_uri.startswith("s3://"): raise ValueError(f"Provided s3 uri {s3_uri} is not valid.") s3_bucket = s3_uri.replace('s3://','').split('/')[0] print(f"S3 Bucket: {s3_bucket}") try: s3.meta.client.head_bucket(Bucket=s3_bucket) except Exception as e: raise e aws_s3_sync(s3_uri, local_path) return

Penggunaan fungsi pembantu:

#base_s3_uri - user input s3 uri or save to model directory (default) #curr_host - to save checkpoints of current host #iteration - current step/epoch during which checkpoint is saved # save checkpoints on every node using local_rank if smp.local_rank() == 0: base_s3_uri = os.path.dirname(os.path.dirname(os.getenv('SM_MODULE_DIR', ''))) curr_host = os.environ['SM_CURRENT_HOST'] full_s3_uri = f'{base_s3_uri}/checkpoints/{curr_host}/{iteration}' sync_local_checkpoints_to_s3(local_path=checkpoint_dir, s3_uri=full_s3_uri)

Konvergensi Menggunakan Model Paralel dan TensorFlow

Saat Anda menggunakan pelatihan SageMaker multi-node dengan TensorFlow dan pustaka paralelisme model, kerugian mungkin tidak menyatu seperti yang diharapkan karena urutan file input pelatihan mungkin berbeda pada setiap node. Ini dapat menyebabkan peringkat yang berbeda dalam grup paralel model yang sama bekerja pada file input yang berbeda, menyebabkan inkonsistensi. Untuk mencegah hal ini, pastikan file input diurutkan dengan cara yang sama di semua peringkat sebelum dikonversi ke TensorFlow kumpulan data. Salah satu cara untuk mencapai ini adalah dengan mengurutkan nama file input dalam skrip pelatihan.

Menghentikan atau Menghancurkan Pekerjaan Pelatihan Terdistribusi

Jika pekerjaan pelatihan Anda mengalami masalah macet, mogok, atau tidak merespons, baca item pemecahan masalah berikut untuk mengidentifikasi penyebab masalah tersebut. Jika Anda membutuhkan dukungan lebih lanjut, hubungi tim pelatihan SageMaker terdistribusi melalui AWS Support.

  • Jika Anda melihat pekerjaan pelatihan terdistribusi terhenti pada langkah inisialisasi NCCL, pertimbangkan hal berikut:

    • Jika Anda menggunakan salah satu instans (ml.p4datau ml.p3dn instance) yang mendukung EFA dengan VPC kustom dan subnetnya, pastikan bahwa grup keamanan yang digunakan memiliki koneksi masuk dan keluar untuk semua port ke dan dari SG yang sama. Anda juga umumnya memerlukan koneksi keluar ke IP apa pun sebagai aturan terpisah (untuk akses internet). Untuk menemukan petunjuk tentang cara menambahkan aturan masuk dan keluar untuk komunikasi EFA, lihat. SageMaker mengulur-ulur pekerjaan pelatihan terdistribusi selama inisialisasi

  • Jika Anda melihat pekerjaan pelatihan terdistribusi terhenti saat memeriksa model lengkap, ini mungkin karena state_dict() panggilan pada model atau pengoptimal tidak dilakukan di semua peringkat dengan rdp_rank()==0 (saat menggunakan paralelisme tensor) atau dp_rank()==0 (saat hanya menggunakan paralelisme pipa). Peringkat ini perlu berkomunikasi untuk membangun pos pemeriksaan untuk diselamatkan. Masalah penghentian serupa juga dapat terjadi saat checkpointing pengoptimal sebagian jika diaktifkan. shard_optimizer_state

    Untuk informasi selengkapnya tentang checkpointing model dengan paralelisme model, lihat Instruksi Umum untuk Menyimpan dan Memuat dan. Checkpointing PyTorch model terdistribusi (untuk pustaka paralelisme SageMaker model antara v1.6.0 dan v1.9.0)

  • Jika pekerjaan pelatihan macet dengan kesalahan CUDA Out of Memory, ini berarti bahwa konfigurasi pelatihan terdistribusi perlu disesuaikan agar sesuai dengan model pada cluster GPU. Untuk informasi lebih lanjut dan praktik terbaik, lihatMenyiapkan Konfigurasi yang Tepat untuk Model yang Diberikan.

  • Jika pekerjaan pelatihan macet dengan kesalahan ECC yang tidak dapat diperbaiki, ini berarti bahwa salah satu GPU di cluster menjadi buruk. Jika Anda memerlukan dukungan teknis, bagikan pekerjaan ARN dengan AWS tim dan mulai ulang pekerjaan pelatihan Anda dari pos pemeriksaan jika memungkinkan.

  • Dalam kasus yang jarang terjadi, konfigurasi pekerjaan yang bekerja sebelumnya tetapi mendekati batas memori GPU mungkin gagal nanti dengan cluster yang berbeda karena kesalahan CUDA Out of Memory. Ini bisa jadi karena beberapa GPU memiliki memori yang tersedia lebih rendah dari biasanya karena kesalahan ECC.

  • Kerusakan batas waktu jaringan mungkin terjadi saat menjalankan pekerjaan multinode yang tidak menggunakan semua GPU di node. Untuk menyiasatinya, gunakan semua GPU pada node dengan memastikan bahwa processes_per_host parameter diatur ke jumlah GPU di setiap instance. Misalnya, ini processes_per_host=8 untukml.p3.16xlarge,ml.p3dn.24xlarge, dan ml.p4d.24xlarge contoh.

  • Jika Anda menemukan bahwa pekerjaan pelatihan Anda membutuhkan waktu lama selama tahap pengunduhan data, pastikan jalur Amazon S3 yang Anda berikan checkpoint_s3_uri untuk SageMaker Estimator kelas tersebut unik untuk pekerjaan pelatihan saat ini. Jika jalur ini digunakan kembali di beberapa pekerjaan pelatihan yang berjalan secara bersamaan, semua pos pemeriksaan tersebut diunggah dan diunduh ke jalur Amazon S3 yang sama dan mungkin secara signifikan meningkatkan waktu pemuatan pos pemeriksaan.

  • Gunakan FSx for Lustre ketika Anda berurusan dengan data besar dan model.

    • Jika kumpulan data Anda besar dan mengambilnya membutuhkan waktu lama, kami sarankan untuk menyimpan kumpulan data Anda di FSx for Lustre.

    • Ketika model pelatihan melebihi 10 miliar parameter, kami sarankan menggunakan FSx for Lustre untuk pos pemeriksaan.

    • Setelah Anda membuat sistem file, pastikan untuk menunggu status tersedia sebelum memulai pekerjaan pelatihan menggunakannya.

Menerima Kesalahan NCCL untuk Training Job PyTorch

Jika Anda mengalami kesalahan berikut, mungkin karena proses kehabisan memori GPU.

NCCL error in: ../torch/lib/c10d/ProcessGroupNCCL.cpp:825, unhandled system error, NCCL version 2.7.8 ncclSystemError: System call (socket, malloc, munmap, etc) failed.

Anda dapat mengatasi ini dengan mengurangi ukuran batch atauactive_microbatches. Jika partisi otomatis tidak menghasilkan partisi yang seimbang, Anda mungkin harus mempertimbangkan partisi manual. Untuk informasi selengkapnya, lihat Paralelisme pipa di seluruh node.

Menerima RecursionError PyTorch Training Job

Pustaka tidak mendukung pemanggilan super.forward() di dalam panggilan penerusan modul. Jika Anda menggunakansuper.forward(), Anda mungkin menerima pesan galat berikut.

RecursionError: maximum recursion depth exceeded

Untuk memperbaiki kesalahan, alih-alih meneleponsuper.forward(), Anda harus meneleponsuper()._orig_forward().