ผู้แต่ง:Vikesh Pandey, Othmane Hamzaoui

ใน “ตอนที่ 1” และ “ตอนที่ 2” เราได้แสดงวิธีที่คุณสามารถฝึกโมเดลของคุณได้อย่างง่ายดายบน Amazon SageMaker พร้อมทั้งให้ข้อมูลและการกำหนดค่าของคุณเองด้วย แม้ว่า Amazon SageMaker จะจัดเตรียมคอนเทนเนอร์สำหรับเฟรมเวิร์ก Deep Learning ที่ได้รับความนิยมส่วนใหญ่ เช่น Tensorflow, PyTorch, MxNet, HuggingFace, XGBoost ฯลฯ อาจมีกรณีที่คุณต้องการใช้ Bring Your Own Container (BYOC) เพื่อฝึกโมเดลของคุณ

ในบล็อกนี้เราจะครอบคลุมประเด็นต่อไปนี้:

  • เมื่อใดที่ควรใช้ BYOC และเมื่อใดที่คุณไม่จำเป็นต้อง BYOC จริงๆ
  • คุณควรห่อรหัสการฝึกอบรมไว้ในคอนเทนเนอร์หรือไม่?
  • วิธี BYOC ใน SageMaker
  • สิ่งใดเปลี่ยนแปลงและสิ่งใดไม่เปลี่ยนแปลง เมื่อคุณ BYOC (เปรียบเทียบกับการใช้คอนเทนเนอร์ที่จัดการโดย SageMaker)

หมายเหตุ: บล็อกนี้เน้นเฉพาะการฝึกอบรม แต่คุณสามารถใช้ BYOC สำหรับการประมวลผลข้อมูลและการอนุมานได้เช่นกัน

เมื่อใดจึงจะใช้ BYOC:

  • หากคอนเทนเนอร์เฟรมเวิร์กที่ได้รับการจัดการของ SageMaker ไม่ใช่คอนเทนเนอร์ที่คุณต้องการใช้
  • หากคอนเทนเนอร์ที่ SageMaker จัดเตรียมไว้มีการขึ้นต่อกันอย่างน้อยหนึ่งรายการที่คุณไม่ต้องการในสภาพแวดล้อมการฝึกอบรม/การอนุมาน คุณสามารถตรวจสอบ Dockerfile สำหรับคอนเทนเนอร์ที่จัดการโดย SageMaker ทั้งหมดได้ ที่นี่
  • คุณมีข้อกำหนดด้านกฎระเบียบและการปฏิบัติตามข้อกำหนดให้ใช้เฉพาะคอนเทนเนอร์ที่คุณบำรุงรักษาเท่านั้น
  • คุณกำลังจัดหาการอ้างอิงจำนวนมาก (ผ่าน requirement.txt) ให้กับคอนเทนเนอร์ที่ SageMaker จัดเตรียมไว้ และการติดตั้งนี้ใช้เวลานานในขณะที่รันงานการฝึก
  • สภาพแวดล้อมของคุณบังคับให้ไม่มีการเชื่อมต่ออินเทอร์เน็ตเพื่อดาวน์โหลดแพ็คเกจ
  • คุณต้องมีการรับประกันความสามารถในการทำซ้ำที่เข้มงวดสำหรับคอนเทนเนอร์ที่คุณใช้

เมื่อคุณไม่ต้องการ BYOC จริงๆ:

  • คอนเทนเนอร์และเวอร์ชันของเฟรมเวิร์กที่ได้รับการจัดการของ SageMaker (PyTorch, Tensorflow ฯลฯ) ตอบสนองความต้องการของคุณ คุณสามารถเรียกดูรายการคอนเทนเนอร์ที่จัดการโดย SageMaker ได้ "ที่นี่"
  • คุณต้องการรวมไลบรารีของบุคคลที่สามจำนวนหนึ่งด้วย ในกรณีนี้ เพียงวาง “requirements.txt” ในไดเร็กทอรีในเครื่องและอ้างอิงโดยใช้พารามิเตอร์ source_dir ใน SageMaker estimator SageMaker จะติดตั้งไลบรารีเหล่านั้นในขณะรันไทม์ คำเตือน: วิธีการนี้จะติดตั้ง Requirement.txt ที่จุดเริ่มต้นของงานการฝึก หากกระบวนการติดตั้งยาวเกินไป อาจทำให้ประสิทธิภาพการทำงานของคุณช้าลง
  • คุณต้องการเพิ่มสคริปต์เพิ่มเติม (ข้างไฟล์การฝึกอบรมหลักของคุณ) เช่นเดียวกับจุดก่อนหน้า คุณสามารถวางไว้ในไดเร็กทอรีในเครื่องและอ้างอิงโดยใช้พารามิเตอร์ source_dir หรือ dependenciesparameter ใน SageMaker estimator

คุณรวมรหัสการฝึกอบรมไว้ในคอนเทนเนอร์หรือไม่?

ไม่ คุณไม่จำเป็นต้องทำ หากคุณรวมโค้ดไว้ในคอนเทนเนอร์ ทุกครั้งที่คุณทำการเปลี่ยนแปลงโค้ด คุณจะต้องสร้างมันใหม่ และอาจส่งผลต่อประสิทธิภาพการทำงานของคุณ SageMaker มีวิธีจัดหาโค้ดการฝึกอบรมภายนอกคอนเทนเนอร์ ณ รันไทม์ ดังนั้นคุณจึงสามารถมุ่งเน้นไปที่การวนซ้ำโค้ดของคุณในขณะที่นำคอนเทนเนอร์เดิมกลับมาใช้ใหม่ได้ หากคุณยังคงมีเหตุผลเพียงพอที่จะใส่รหัสการฝึกอบรมลงในคอนเทนเนอร์ คุณก็สามารถทำได้อย่างแน่นอน

มาดูวิธี BYOC ใน SageMaker กันต่อ

วิธี BYOC ใน SageMaker

ในส่วนนี้ เราจะดูวิธีสร้างคอนเทนเนอร์ PyTorch ที่คุณกำหนดเอง และใช้เพื่อฝึกโมเดล เมื่อใช้ BYOC คุณไม่จำเป็นต้องทำการเปลี่ยนแปลงใดๆ กับรหัสการฝึกอบรมของคุณเลย นี่คือขั้นตอนที่เราจะปฏิบัติตาม:

  1. สร้างอิมเมจนักเทียบท่า — เวอร์ชันเดียวกัน (1.12) เหมือนกับเวอร์ชันที่เราใช้ในตัวอย่างก่อนหน้านี้
  2. พุชอิมเมจนักเทียบท่าบนที่เก็บส่วนตัว Amazon ECR
  3. ใช้รูปภาพที่กำหนดเองสำหรับการฝึกอบรม — แทนคอนเทนเนอร์ PyTorch ที่จัดการโดย SageMaker นอกจากนี้ ที่นี่คุณยังระบุรหัสการฝึกอบรมภายนอกคอนเทนเนอร์อีกด้วย เพิ่มเติมเกี่ยวกับเรื่องนี้ในภายหลัง

1. สร้างอิมเมจนักเทียบท่า

หมายเหตุ: เราจะไม่กล่าวถึงพื้นฐานของนักเทียบท่าที่นี่ แต่หากคุณไม่คุ้นเคยกับ docker คุณสามารถดูบทช่วยสอนต่อไปนี้ Docker 101 Tutorial

1.1 สร้าง Dockerfile

มีสองวิธีในการปรับคอนเทนเนอร์ที่คุณกำหนดเองให้ทำงานบน SageMaker

  1. การใช้ ชุดเครื่องมือการฝึกอบรม Pytorch ที่ SageMaker มอบให้— นี่เป็นแนวทางที่แนะนำ เนื่องจากชุดเครื่องมือจะตั้งค่าต่อไปนี้ให้กับคุณ:
    – ตำแหน่ง (ภายในคอนเทนเนอร์) สำหรับจัดเก็บโค้ด โมเดล และ ทรัพยากรอื่นๆ
    – จุดเริ่มต้นที่มีโค้ดที่จะรันเมื่อคอนเทนเนอร์เริ่มทำงาน ตอนนี้คุณสามารถคัดลอกโค้ดการฝึกของคุณในอิมเมจนักเทียบท่าในขณะที่สร้างอิมเมจนั้นเอง หรือคุณสามารถจัดหาสคริปต์การฝึกของคุณในขณะรันไทม์จากภายนอกคอนเทนเนอร์ได้
    – ตัวแปรสภาพแวดล้อมและการกำหนดค่าอื่น ๆ ที่ SageMaker ต้องใช้นักเทียบท่าสำหรับ การฝึกอบรม.
  2. หากไม่มี SageMaker จัดเตรียมชุดเครื่องมือการฝึกอบรม Pytorch — ในกรณีนี้ คุณจะต้องแน่ใจว่านักเทียบท่าปฏิบัติตามแนวทางของ เอกสารประกอบนี้

เราจะใช้ (และแนะนำ) แนวทางแรกที่นี่

ด้านล่างนี้เป็นตัวอย่าง Dockerfile:

from pytorch/pytorch:1.12.0-cuda11.3-cudnn8-runtime

RUN apt-get update && apt-get install gcc -y

RUN pip install sagemaker-pytorch-training

เราเลือกอิมเมจพื้นฐานจาก ที่เก็บ PyTorch อย่างเป็นทางการ ด้วยเวอร์ชัน 1.12 และติดตั้ง gcc เนื่องจากจำเป็นต้องมีการพึ่งพานี้โดย sagemaker-pytorch-training และสุดท้ายเราก็ติดตั้ง sagemaker-pytorch-training.

1.2 สร้างภาพ

สำหรับการสร้างอิมเมจ คุณสามารถเลือกเครื่องภายในเครื่องของคุณ หรืออินสแตนซ์/สภาพแวดล้อมในระบบคลาวด์ที่ติดตั้ง Docker ได้ เพียงนำทางไปยังไดเร็กทอรีที่มี Dockerfile (สร้างใน 1.1) และรันในเทอร์มินัลของคุณ:

docker build -t {Your_AWS_Account_ID}.dkr.ecr.
{Your_AWS_Region}.amazonaws.com/{Custom_Image_Name}:{tag} .

2. พุช Docker Image ไปที่ Amazon ECR

ขั้นตอนต่อไปคือการส่งอิมเมจนักเทียบท่าไปยังรีจิสทรีนักเทียบท่า SageMaker ได้รับการผสานรวมเข้ากับ Amazon ECR โดยกำเนิด ดังนั้นเราจะผลักดันอิมเมจของเราไปที่นั่น คุณสามารถใช้พื้นที่เก็บข้อมูลส่วนตัวของคุณเองได้เช่นกัน

2.1 ตรวจสอบสิทธิ์ ECR ก่อน

aws ecr get-login-password -region {Your_AWS_Region} | docker login -username AWS -password-stdin {Your_AWS_Account_ID}.dkr.ecr.{Your_AWS_Account_ID}.amazonaws.com

2.2 สร้างที่เก็บ ECR

aws ecr create-repository -repository-name "custom-pytorch-1-12"

2.3 และดันอิมเมจนักเทียบท่าไปที่ ECR

docker push {Your_AWS_Account_ID}.dkr.ecr.{Your_AWS_Region}.amazonaws.com/{Custom_Image_Name}:{tag}

แค่นั้นแหละ ! ตอนนี้เราพร้อมที่จะใช้อิมเมจนี้เพื่อการฝึกอบรมใน SageMaker แล้ว สำหรับคำแนะนำโดยละเอียดเกี่ยวกับการพุชรูปภาพไปที่ ECR โปรดตรวจสอบ "การพุชอิมเมจ Docker"

3. ใช้รูปภาพที่กำหนดเองสำหรับการฝึกอบรม

หากต้องการใช้รูปภาพนี้แทนรูปภาพ PyTorch ของ SageMaker เราจะใช้ PyTorch Estimator แบบเดียวกับที่ใช้ในโพสต์บนบล็อกก่อนหน้านี้ อาร์กิวเมนต์ใหม่เพียงข้อเดียวที่นี่คือ image_uri นอกจากนั้น ข้อโต้แย้งอื่นๆ ทั้งหมดก็เหมือนกัน

ไม่จำเป็นต้องเปลี่ยนแปลงรหัสการฝึกอบรม

การเปลี่ยนแปลงรหัสการโทรมีดังนี้:

#Create the estimator object for PyTorch

from sagemaker.pytorch.estimator import PyTorch # import PyTorch Estimator class 

estimator = PyTorch(
    image_uri=custom_image_uri, #our custom pytorch image URI
    entry_point = "train.py", # training script
    instance_count = 1, #number of EC2 instances needed for training
    instance_type = "ml.c5.xlarge", #Type of EC2 instance/s needed for training
    disable_profiler = True, #Disable profiler, as it's not needed
    role = execution_role, #Execution role used by training job
    hyperparameters={'batch_size': 64}
)



inputs = {"train":train_input, "test": test_input}

#Start the training in the ephemeral remote compute 
estimator.fit(inputs, wait=True)

สิ่งที่เปลี่ยนแปลงและสิ่งที่ไม่:

ดังนั้น เราจะมาสรุปว่าแนวทางนี้แตกต่างจากที่แสดงใน "ส่วนที่ 1" และ "ส่วนที่ 2" อย่างไร

สิ่งที่เปลี่ยนแปลงไป

  • คอนเทนเนอร์การดำเนินการที่สคริปต์การฝึกอบรมของคุณกำลังทำงานอยู่ ตอนนี้มันเป็นคอนเทนเนอร์ของคุณเองแทนที่จะได้รับการจัดการจาก SageMaker ซึ่งหมายความว่าคุณต้องรับผิดชอบในการแพตช์และบำรุงรักษา ดังนั้นต้นทุนรวมในการเป็นเจ้าของของคุณในการจัดการและใช้งานคอนเทนเนอร์จึงสูงกว่า
  • เราจัดเตรียม URI รูปภาพที่กำหนดเองของเราผ่านทางอาร์กิวเมนต์ image_uri ใน PyTorch Estimator

สิ่งที่ไม่เปลี่ยนแปลง

  • SageMaker จัดการคลัสเตอร์การประมวลผลการฝึกอบรมชั่วคราว หมุนขึ้นและปิดหลังจากงานฝึกอบรมเสร็จสิ้น
  • ไดเร็กทอรีงานคอนเทนเนอร์ ข้อมูล โค้ด และเส้นทางเอาต์พุตโมเดลที่สงวนไว้โดย SageMaker ขอขอบคุณ SageMaker มอบชุดเครื่องมือการฝึกอบรม Pytorch ดังนั้น SageMaker จะรันคอนเทนเนอร์ของคุณในลักษณะเดียวกับที่รันคอนเทนเนอร์ที่มีการจัดการของตัวเอง คุณสามารถอ่านเพิ่มเติมเกี่ยวกับการใช้ ชุดเครื่องมือการฝึกอบรมและการอนุมานของ SageMaker
  • รหัสการฝึกอบรม รหัสของคุณนั้นไม่เชื่อว่าคุณใช้คอนเทนเนอร์ที่ได้รับการจัดการหรือ BYOC
  • อาร์กิวเมนต์ทั้งหมดที่ให้กับโค้ดการฝึกอบรมทำงานในลักษณะเดียวกัน เครดิตอีกครั้งไปที่ ชุดเครื่องมือการฝึกอบรม Pytorch ที่ SageMaker จัดหาให้
  • คุณได้จัดเตรียมสคริปต์การฝึกอบรมภายนอกคอนเทนเนอร์ซึ่งเป็นประโยชน์อย่างมากสำหรับการพัฒนาซ้ำ คุณยังคงสามารถรวมสคริปต์การฝึกอบรมไว้ในคอนเทนเนอร์ของคุณได้ แต่สำหรับการเปลี่ยนแปลงโค้ดทุกครั้ง คุณจะต้องสร้างคอนเทนเนอร์อีกครั้ง ซึ่งใช้เวลานาน จำไว้ว่า เวลาคือเงิน !! :)

บทสรุป

ในบล็อกนี้ คุณได้เรียนรู้วิธีการนำอิมเมจ Docker ของคุณเองมาสู่ SageMaker และใช้สำหรับการฝึกอบรม จุดเด่นสำคัญของแนวทางนี้คือคุณสามารถจัดหารหัสการฝึกอบรมภายนอกคอนเทนเนอร์ได้ในขณะดำเนินการ รหัสอ้างอิงทั้งหมดของบล็อกนี้มีอยู่ใน Github Repository หากต้องการอ่านเพิ่มเติม โปรดชำระเงิน การใช้คอนเทนเนอร์ Docker กับ SageMaker

Twitter จัดการ: @vikep0, @OHamzaoui1