Pekerjaan pelatihan terdistribusi tradisional menetapkan jumlah worker saat pengiriman. Elastic Horovod menghilangkan batasan ini: Anda dapat memperluas atau mengurangi jumlah worker selama pekerjaan berlangsung tanpa harus me-restart atau memulihkan dari checkpoint. Gunakan fitur ini ketika:
-
Kluster Anda mencakup instans preemptible yang sewaktu-waktu dapat ditarik kembali.
-
Anda ingin memanfaatkan kapasitas GPU idle yang tersedia.
-
Anda perlu mengurangi biaya pelatihan dengan melepas worker yang kurang dimanfaatkan di tengah pekerjaan.
Prasyarat
Sebelum memulai, pastikan Anda telah:
-
Men-deploy cloud-native AI suite di kluster ACK Anda dengan memilih Elastic Training dan Arena selama penerapan. Untuk detailnya, lihat Deploy the cloud-native AI suite.
-
Menggunakan Horovod sebagai framework pelatihan terdistribusi.
-
Memiliki skrip pelatihan yang menggunakan Horovod sebagai framework pelatihan terdistribusi.
-
Menginstal client Arena. Untuk detailnya, lihat Configure the Arena client.
Kirim pekerjaan pelatihan elastis
Jalankan perintah berikut untuk mengirim pekerjaan pelatihan elastis:
arena submit etjob \
--name=elastic-training \
--gpus=1 \
--workers=3 \
--max-workers=9 \
--min-workers=1 \
--image=registry.cn-hangzhou.aliyuncs.com/ai-samples/horovod:0.20.0-tf2.3.0-torch1.6.0-mxnet1.6.0.post0-py3.7-cuda10.1 \
--working-dir=/examples \
"horovodrun \
-np \$((\${workers}*\${gpus})) \
--min-np \$((\${minWorkers}*\${gpus})) \
--max-np \$((\${maxWorkers}*\${gpus})) \
--host-discovery-script /etc/edl/discover_hosts.sh \
python /examples/elastic/tensorflow2_mnist_elastic.py
"
Wrapper horovodrun mengelola proses pelatihan elastis. Arena menulis nilai parameter ke variabel lingkungan, yang dibaca oleh horovodrun melalui flag -np, --min-np, dan --max-np.
Skrip penemuan host di /etc/edl/discover_hosts.sh dibuat oleh komponen et-operator.
| Parameter | Deskripsi |
|---|---|
--name |
Nama pekerjaan pelatihan. Harus unik secara global. |
--gpus |
Jumlah GPU yang dialokasikan untuk setiap worker. |
--workers |
Jumlah worker untuk menjalankan tugas pelatihan. |
--max-workers |
Jumlah maksimum worker untuk tugas pelatihan. |
--min-workers |
Jumlah minimum worker untuk tugas pelatihan. |
--image |
Image kontainer yang digunakan untuk menjalankan pekerjaan. |
--working-dir |
Direktori tempat perintah dijalankan di dalam kontainer. |
--np |
Jumlah worker yang digunakan untuk tugas. Dihitung dari ${workers}*${gpus}. |
--max-np |
Jumlah maksimum worker yang digunakan untuk tugas. Dihitung dari ${maxWorkers}*${gpus}. |
--min-np |
Jumlah minimum worker yang digunakan untuk tugas. Dihitung dari ${minWorkers}*${gpus}. |
--host-discovery-script |
Path ke skrip penemuan host. Komponen et-operator membuat skrip ini di /etc/edl/discover_hosts.sh. |
Output yang diharapkan mirip dengan:
configmap/elastic-training-etjob created
configmap/elastic-training-etjob labeled
trainingjob.kai.alibabacloud.com/elastic-training created
INFO[0000] The Job elastic-training has been submitted successfully
INFO[0000] You can run `arena get elastic-training --type etjob` to check the job status
Verifikasi pekerjaan yang sedang berjalan
Jalankan perintah berikut untuk memeriksa status pekerjaan:
arena get elastic-training
Output yang diharapkan mirip dengan:
Nama: elastic-training
Status: RUNNING
Namespace: default
Prioritas: N/A
Pelatih: ETJOB
Durasi: 3m
Instance:
NAMA STATUS USIA ADALAH_CHIEF GPU(Diminta) NODE
---- ------ ---- ------------ ------------ ----
elastic-training-launcher Running 3m true 0 cn-huhehaote.192.168.0.173
elastic-training-worker-0 Running 3m false 1 cn-huhehaote.192.168.0.174
elastic-training-worker-1 Running 3m false 1 cn-huhehaote.192.168.0.174
Untuk memeriksa progres pelatihan, lihat baris log terbaru:
arena logs elastic-training --tail 10
Output yang diharapkan mirip dengan:
[0]<stdout>:Step #340 Loss: 0.047924
[1]<stdout>:Step #340 Loss: 0.116303
[0]<stdout>:Step #350 Loss: 0.068762
[1]<stdout>:Step #350 Loss: 0.040847
[0]<stdout>:Step #360 Loss: 0.057501
[1]<stdout>:Step #360 Loss: 0.111952
[0]<stdout>:Step #370 Loss: 0.085895
[1]<stdout>:Step #370 Loss: 0.075529
[0]<stdout>:Step #380 Loss: 0.063450
[1]<stdout>:Step #380 Loss: 0.054253
Scale out worker
Jalankan perintah berikut untuk menambahkan worker ke pekerjaan yang sedang berjalan:
arena scaleout etjob --name="elastic-training" --count=1 --timeout=10m
| Parameter | Deskripsi |
|---|---|
--name |
Nama pekerjaan pelatihan yang akan diskala. |
--count |
Jumlah worker yang akan ditambahkan. |
--timeout |
Periode timeout operasi scale-out. Jika worker tidak dibuat sebelum periode timeout berakhir, penjadwal akan membatalkan operasi scale-out. |
Output yang diharapkan mirip dengan:
configmap/elastic-training-1609914643-scaleout created
configmap/elastic-training-1609914643-scaleout labeled
scaleout.kai.alibabacloud.com/elastic-training-1609914643 created
INFO[0003] The scaleout job elastic-training-1609914643 has been submitted successfully
Untuk memastikan worker baru sedang berjalan, periksa status pekerjaan:
arena get elastic-training
Output yang diharapkan mirip dengan:
Name: elastic-training
Status: RUNNING
Namespace: default
Priority: N/A
Trainer: ETJOB
Duration: 3m
Instances:
NAME STATUS AGE IS_CHIEF GPU(Requested) NODE
---- ------ --- -------- -------------- ----
elastic-training-launcher Running 3m true 0 cn-huhehaote.192.168.0.173
elastic-training-worker-0 Running 3m false 1 cn-huhehaote.192.168.0.174
elastic-training-worker-1 Running 3m false 1 cn-huhehaote.192.168.0.174
elastic-training-worker-2 Running 1m false 1 cn-huhehaote.192.168.0.173
elastic-training-worker-2 kini aktif. Log akan menampilkan output dari ketiga worker (indeks [0], [1], dan [2]):
arena logs elastic-training --tail 10[1]<stdout>:Step #1670 Loss: 0.131210
[2]<stdout>:Step #1680 Loss: 0.020876
[0]<stdout>:Step #1680 Loss: 0.030605
[1]<stdout>:Step #1680 Loss: 0.074515
[2]<stdout>:Step #1690 Loss: 0.029105
[0]<stdout>:Step #1690 Loss: 0.015216
[1]<stdout>:Step #1690 Loss: 0.022670
[0]<stdout>:Step #1700 Loss: 0.105407
[1]<stdout>:Step #1700 Loss: 0.037623
[2]<stdout>:Step #1700 Loss: 0.032874
Scale in worker
Jalankan perintah berikut untuk menghapus worker dari pekerjaan yang sedang berjalan:
arena scalein etjob --name="elastic-training" --count=1 --timeout=10m
| Parameter | Deskripsi |
|---|---|
--name |
Nama pekerjaan pelatihan yang akan diskala. |
--count |
Jumlah worker yang akan dihapus. |
--timeout |
Periode timeout operasi scale-in. |
Output yang diharapkan mirip dengan:
configmap/elastic-training-1609914720-scalein created
configmap/elastic-training-1609914720-scalein labeled
scalein.kai.alibabacloud.com/elastic-training-1609914720 created
INFO[0002] The scalein job elastic-training-1609914720 has been submitted successfully
Untuk memastikan worker telah dihapus, periksa status pekerjaan:
arena get elastic-training
Output yang diharapkan mirip dengan:
Name: elastic-training
Status: RUNNING
Namespace: default
Priority: N/A
Trainer: ETJOB
Duration: 3m
Instances:
NAME STATUS AGE IS_CHIEF GPU(Requested) NODE
---- ------ --- -------- -------------- ----
elastic-training-launcher Running 3m true 0 cn-huhehaote.192.168.0.173
elastic-training-worker-0 Running 3m false 1 cn-huhehaote.192.168.0.174
elastic-training-worker-1 Running 3m false 1 cn-huhehaote.192.168.0.174
elastic-training-worker-2 tidak lagi tercantum. Log hanya akan menampilkan output dari dua worker:
arena logs elastic-training --tail 10[1]<stdout>:Step #2180 Loss: 0.001739
[0]<stdout>:Step #2180 Loss: 0.004853
[0]<stdout>:Step #2190 Loss: 0.000846
[1]<stdout>:Step #2190 Loss: 0.007900
[0]<stdout>:Step #2200 Loss: 0.039376
[1]<stdout>:Step #2200 Loss: 0.024672
[0]<stdout>:Step #2210 Loss: 0.012985
[1]<stdout>:Step #2210 Loss: 0.010956
[0]<stdout>:Step #2220 Loss: 0.009604
[1]<stdout>:Step #2220 Loss: 0.002531