ปรับงานการอนุมานของคุณให้เหมาะสมโดยใช้การอนุมานแบบแบตช์แบบไดนามิกด้วย TorchServe บน Amazon SageMaker

โหนดต้นทาง: 1884601

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

การรวมชุดจะมีประโยชน์ในหลายสถานการณ์ในระหว่างการปรับใช้แบบจำลองในการผลิต ที่นี่เราแบ่งประเภทกว้าง ๆ ออกเป็นสองกรณีการใช้งาน:

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

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

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

แนวทางปฏิบัติที่ดีที่สุดสำหรับการอนุมานแบบกลุ่ม

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

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

TorchServe การแบตช์แบบไดนามิกบน SageMaker

คบเพลิงให้บริการ เป็นไลบรารี PyTorch ดั้งเดิมสำหรับให้บริการโมเดลในการผลิตในปริมาณมาก เป็นการพัฒนาร่วมกันระหว่าง Facebook และ AWS TorchServe ให้คุณตรวจสอบ เพิ่มตัววัดแบบกำหนดเอง รองรับหลายรุ่น เพิ่มและลดจำนวนพนักงานผ่าน API การจัดการที่ปลอดภัย และให้ปลายทางการอนุมานและคำอธิบาย

เพื่อรองรับการประมวลผลแบบแบตช์ TorchServe ได้จัดเตรียมคุณลักษณะการแบตช์แบบไดนามิก จะรวบรวมคำขอที่ได้รับภายในกรอบเวลาที่กำหนด แบทช์เข้าด้วยกัน และส่งแบทช์เพื่อการอนุมาน คำขอที่ได้รับจะได้รับการประมวลผลผ่าน ขนย้ายวัสดุ ใน TorchServe TorchServe มีตัวจัดการเริ่มต้นหลายตัว และคุณสามารถเขียนตัวจัดการแบบกำหนดเองได้ หากไม่ครอบคลุมกรณีการใช้งานของคุณ เมื่อใช้ตัวจัดการแบบกำหนดเอง ตรวจสอบให้แน่ใจว่ามีการใช้ตรรกะการอนุมานแบบแบตช์ในตัวจัดการแล้ว ตัวอย่างของตัวจัดการแบบกำหนดเองพร้อมการสนับสนุนการอนุมานแบบแบตช์มีอยู่ใน GitHub.

คุณสามารถกำหนดค่าการแบตช์ไดนามิกโดยใช้การตั้งค่าสองแบบ batch_size และ max_batch_delayผ่านตัวแปรสภาพแวดล้อมใน SageMaker หรือผ่าน config.properties ไฟล์ใน TorchServe (หากใช้คอนเทนเนอร์แบบกำหนดเอง) TorchServe ใช้การตั้งค่าใด ๆ ที่มาก่อน ไม่ว่าจะเป็นขนาดแบทช์สูงสุด (batch_size) หรือกรอบเวลาที่กำหนดเพื่อรอแบทช์ของคำขอผ่าน max_batch_delay.

ด้วยการผสานการทำงาน TorchServe กับ SageMaker ตอนนี้คุณสามารถปรับใช้โมเดล PyTorch แบบเนทีฟบน SageMaker ซึ่งคุณสามารถกำหนดโมเดล SageMaker PyTorch ได้ คุณสามารถเพิ่มการโหลดโมเดลแบบกำหนดเอง การอนุมาน และตรรกะการประมวลผลล่วงหน้าและหลังการประมวลผลในสคริปต์ที่ส่งผ่านเป็นจุดเริ่มต้นไปยัง SageMaker PyTorch (ดูโค้ดตัวอย่างต่อไปนี้) หรือคุณสามารถใช้คอนเทนเนอร์แบบกำหนดเองเพื่อปรับใช้โมเดลของคุณ ดูข้อมูลเพิ่มเติมได้ที่ เซิร์ฟเวอร์รุ่น SageMaker PyTorch.

คุณสามารถกำหนดขนาดแบตช์สำหรับรุ่น PyTorch บน SageMaker ผ่านตัวแปรสภาพแวดล้อม หากคุณเลือกใช้คอนเทนเนอร์แบบกำหนดเอง คุณสามารถรวมกลุ่ม การตั้งค่า in config.properties กับโมเดลของคุณเมื่อทำการบรรจุโมเดลของคุณใน TorchServe ข้อมูลโค้ดต่อไปนี้แสดงตัวอย่างวิธีตั้งค่าขนาดแบตช์โดยใช้ตัวแปรสภาพแวดล้อมและวิธีปรับใช้โมเดล PyTorch บน SageMaker:

from SageMaker.pytorch.model import PyTorchModel env_variables_dict = { "SAGEMAKER_TS_BATCH_SIZE": "3", "SAGEMAKER_TS_MAX_BATCH_DELAY": "100000"
} pytorch_model = PyTorchModel( model_data=model_artifact, role=role, source_dir="code", framework_version='1.9', entry_point="inference.py", env=env_variables_dict
) predictor = pytorch_model.deploy(initial_instance_count=1, instance_type="ml.c5.2xlarge", serializer=SageMaker.serializers.JSONSerializer(), deserializer=SageMaker.deserializers.BytesDeserializer())

ในข้อมูลโค้ด model_artifact หมายถึงไฟล์ที่จำเป็นทั้งหมดสำหรับการโหลดแบบจำลองที่ได้รับการฝึกกลับมา ซึ่งถูกเก็บถาวรในไฟล์ .tar และผลักเข้าไปใน บริการจัดเก็บข้อมูลอย่างง่ายของ Amazon (Amazon S3) ถัง inference.py นั้นคล้ายกับตัวจัดการ TorchServe แบบกำหนดเอง; มีฟังก์ชันหลายอย่างที่คุณสามารถแทนที่เพื่อรองรับการเริ่มต้นแบบจำลอง การประมวลผลล่วงหน้าและการประมวลผลภายหลังของคำขอที่ได้รับ และตรรกะการอนุมาน

ดังต่อไปนี้ สมุดบันทึก แสดงตัวอย่างการใช้งานโมเดล Hugging Face BERT

หากคุณต้องการคอนเทนเนอร์แบบกำหนดเอง คุณสามารถสร้างอิมเมจคอนเทนเนอร์แบบกำหนดเองและพุชไปที่ การลงทะเบียน Amazon Elastic Container (Amazon ECR) ที่เก็บ สิ่งประดิษฐ์โมเดลในกรณีนี้สามารถเป็นไฟล์ TorchServe .mar ที่รวมกลุ่มสิ่งประดิษฐ์ของโมเดลพร้อมกับตัวจัดการ เราสาธิตสิ่งนี้ในหัวข้อถัดไป ซึ่งเราใช้งานการแปลงเป็นชุดของ SageMaker

งานการแปลงแบตช์ SageMaker

สำหรับกรณีการใช้งานออฟไลน์ที่มีการร้องขอเป็นแบทช์จากแหล่งข้อมูล เช่น ชุดข้อมูล SageMaker จะจัดเตรียมให้ งานแปลงแบตช์. งานเหล่านี้ทำให้คุณสามารถอ่านข้อมูลจากบัคเก็ต S3 และเขียนผลลัพธ์ไปยังบัคเก็ต S3 เป้าหมายได้ ดูข้อมูลเพิ่มเติมได้ที่ ใช้การแปลงแบบกลุ่มเพื่อรับการอนุมานจากชุดข้อมูลขนาดใหญ่. ตัวอย่างที่สมบูรณ์ของการอนุมานแบบแบตช์โดยใช้งานการแปลงแบบแบตช์สามารถพบได้ในต่อไปนี้ สมุดบันทึกที่เราใช้เครื่องแปลภาษาจากการแข่งขัน FLORES ในตัวอย่างนี้ เราแสดงวิธีใช้คอนเทนเนอร์แบบกำหนดเองเพื่อให้คะแนนโมเดลของเราโดยใช้ SageMaker การใช้คอนเทนเนอร์การอนุมานแบบกำหนดเองช่วยให้คุณปรับแต่งการกำหนดค่า TorchServe เพิ่มเติมได้ ในตัวอย่างนี้ เราต้องการเปลี่ยนและปิดใช้งานการถอดรหัส JSON ซึ่งเราสามารถทำได้ผ่าน TorchServe config.properties ไฟล์

เมื่อใช้ตัวจัดการแบบกำหนดเองสำหรับ TorchServe เราจำเป็นต้องตรวจสอบให้แน่ใจว่าตัวจัดการใช้ตรรกะการอนุมานแบบแบตช์ ตัวจัดการแต่ละตัวสามารถมีฟังก์ชันแบบกำหนดเองเพื่อดำเนินการก่อนการประมวลผล การอนุมาน และการประมวลผลภายหลัง ตัวอย่างของตัวจัดการแบบกำหนดเองพร้อมการสนับสนุนการอนุมานแบบแบตช์มีอยู่ใน GitHub.

เราใช้คอนเทนเนอร์แบบกำหนดเองเพื่อรวมกลุ่มสิ่งประดิษฐ์ของแบบจำลองกับตัวจัดการตามที่เราทำใน TorchServe (สร้างไฟล์ .mar). นอกจากนี้เรายังต้องการจุดเริ่มต้นไปยังคอนเทนเนอร์ Docker ที่เริ่ม TorchServe ด้วยขนาดแบทช์และการถอดรหัส JSON ที่ตั้งค่าไว้ config.properties. เราสาธิตสิ่งนี้ในตัวอย่าง สมุดบันทึก.

งานการแปลงแบบแบตช์ SageMaker ต้องการการเข้าถึงไฟล์อินพุตจากบัคเก็ต S3 โดยจะแบ่งไฟล์อินพุตออกเป็นแบตช์ย่อยและส่งเพื่อการอนุมาน พิจารณาประเด็นต่อไปนี้เมื่อตั้งค่าคอนฟิกงานการแปลงชุดงาน:

  • วางไฟล์อินพุต (เช่น ชุดข้อมูล) ในบัคเก็ต S3 และตั้งค่าเป็นแหล่งข้อมูลในการตั้งค่างาน
  • กำหนดบัคเก็ต S3 เพื่อบันทึกผลลัพธ์ของงานการแปลงแบตช์
  • ชุด กลยุทธ์แบทช์ ไปยัง MultiRecord และ SplitType ไปยัง Line หากคุณต้องการงานการแปลงแบตช์เพื่อสร้างแบตช์ขนาดเล็กจากไฟล์อินพุต หากไม่สามารถแยกชุดข้อมูลออกเป็นแบตช์ย่อยโดยอัตโนมัติ คุณสามารถแบ่งออกเป็นแบตช์ย่อยโดยใส่แต่ละแบตช์ในไฟล์อินพุตแยกจากกัน วางไว้ในบัคเก็ต S3 ของแหล่งข้อมูล
  • ตรวจสอบให้แน่ใจว่าขนาดแบทช์พอดีกับหน่วยความจำ โดยปกติแล้ว SageMaker จะจัดการสิ่งนี้โดยอัตโนมัติ อย่างไรก็ตาม เมื่อแบ่งแบทช์ด้วยตนเอง จำเป็นต้องปรับตามหน่วยความจำ

รหัสต่อไปนี้เป็นตัวอย่างสำหรับงานการแปลงแบบแบตช์:

s3_bucket_name= 'SageMaker-us-west-2-XXXXXXXX'
batch_input = f"s3://{s3_bucket_name}/folder/jobename_TorchServe_SageMaker/"
batch_output = f"s3://{s3_bucket_name}/folder/jobname_TorchServe_SageMaker_output/" batch_job_name = 'job-batch' + time.strftime("%Y-%m-%d-%H-%M-%S", time.gmtime())
batch_job_name request = { "ModelClientConfig": { "InvocationsTimeoutInSeconds": 3600, "InvocationsMaxRetries": 1, }, "TransformJobName": batch_job_name, "ModelName": model_name, "MaxConcurrentTransforms":1, "BatchStrategy": "MultiRecord", "TransformOutput": {"S3OutputPath": batch_output, "AssembleWith": "Line", "Accept": "application/json"}, "TransformInput": { "DataSource": { "S3DataSource": {"S3DataType": "S3Prefix", "S3Uri": batch_input} }, "SplitType" : "Line", "ContentType": "application/json", }, "TransformResources": {"InstanceType": "ml.p2.xlarge", "InstanceCount": 1},
}

เมื่อเราใช้การตั้งค่าก่อนหน้าและเปิดงานการแปลงของเรา มันจะอ่านไฟล์อินพุตจากบัคเก็ต S3 ต้นทางเป็นชุดๆ และส่งไปเพื่อการอนุมาน ผลลัพธ์จะถูกเขียนกลับไปที่บัคเก็ต S3 ที่ระบุไปยังเอาต์พุต

ข้อมูลโค้ดต่อไปนี้แสดงวิธีสร้างและเริ่มต้นงานโดยใช้การตั้งค่าก่อนหน้านี้:

sm.create_transform_job(**request) while True: response = sm.describe_transform_job(TransformJobName=batch_job_name) status = response["TransformJobStatus"] if status == "Completed": print("Transform job ended with status: " + status) break if status == "Failed": message = response["FailureReason"] print("Transform failed with the following error: {}".format(message)) raise Exception("Transform job failed") print("Transform job is still in status: " + status) time.sleep(30)

สรุป

ในโพสต์นี้ เราได้ตรวจสอบสองโหมดที่ SageMaker เสนอสำหรับการอนุมานทางออนไลน์และออฟไลน์ อดีตใช้ชุดงานแบบไดนามิกที่มีให้ใน TorchServe เพื่อแบทช์คำขอจากไคลเอนต์หลายเครื่อง หลังใช้งานการแปลง SageMaker เพื่อแบทช์คำขอจากไฟล์อินพุตในบัคเก็ต S3 และเรียกใช้การอนุมาน

นอกจากนี้เรายังแสดงวิธีให้บริการโมเดลบน SageMaker โดยใช้อิมเมจคอนเทนเนอร์ชุดเครื่องมือการอนุมานของ SageMaker PyTorch และวิธีใช้คอนเทนเนอร์แบบกำหนดเองสำหรับกรณีการใช้งานที่ต้องใช้การตั้งค่าการกำหนดค่า TorchServe ขั้นสูง

เนื่องจาก TorchServe พัฒนาอย่างต่อเนื่องเพื่อตอบสนองความต้องการของชุมชน PyTorch ฟีเจอร์ใหม่จึงถูกรวมเข้ากับ SageMaker เพื่อมอบวิธีการที่มีประสิทธิภาพสำหรับการให้บริการโมเดลในการผลิต สำหรับข้อมูลเพิ่มเติม โปรดดูที่ ที่เก็บถาวร TorchServe GitHub และ ตัวอย่าง SageMaker.


เกี่ยวกับผู้เขียน

พี่เหงียน เป็นสถาปนิกโซลูชันของ AWS ที่ช่วยลูกค้าในการเดินทางบนคลาวด์โดยเน้นที่ Data Lake การวิเคราะห์ เทคโนโลยีความหมาย และการเรียนรู้ของเครื่อง ในเวลาว่าง คุณสามารถพบว่าเขาขี่จักรยานไปทำงาน สอนทีมฟุตบอลของลูกชาย หรือเพลิดเพลินกับการเดินชมธรรมชาติกับครอบครัว

นิกิล กุลคาร์นิ เป็นนักพัฒนาซอฟต์แวร์ที่มี AWS Machine Learning โดยมุ่งเน้นที่การทำให้เวิร์กโหลดของแมชชีนเลิร์นนิงมีประสิทธิภาพมากขึ้นบนคลาวด์ และเป็นผู้สร้างร่วมของ AWS Deep Learning Containers สำหรับการฝึกอบรมและการอนุมาน เขาหลงใหลเกี่ยวกับการกระจายระบบการเรียนรู้เชิงลึก นอกงาน เขาชอบอ่านหนังสือ เล่นกีตาร์ และทำพิซซ่า

ฮามิด โชยานาเซรี่ เป็นวิศวกรพันธมิตรของ Pytorch ที่ทำงานเกี่ยวกับการเพิ่มประสิทธิภาพและการให้บริการโมเดลประสิทธิภาพสูงของ OSS ฮามิดจบปริญญาเอกด้าน Computer vision และทำงานเป็นนักวิจัยในห้องปฏิบัติการมัลติมีเดียในออสเตรเลีย มาเลเซีย และหัวหน้า NLP ใน Opus.ai เขาชอบค้นหาวิธีแก้ปัญหาที่ง่ายกว่าและชอบศิลปะในเวลาว่าง

กีต้า เชาฮัน เป็นผู้นำด้าน AI Partner Engineering ที่ Meta AI ด้วยความเชี่ยวชาญในการสร้างแพลตฟอร์มแบบกระจายขนาดใหญ่ที่ยืดหยุ่น ป้องกันการเปราะบาง สำหรับสตาร์ทอัพและ Fortune 500 ทีมงานของเธอทำงานร่วมกับพันธมิตรเชิงกลยุทธ์ ผู้นำด้านการเรียนรู้ของเครื่องทั่วทั้งอุตสาหกรรม และผู้ให้บริการระบบคลาวด์รายใหญ่ทั้งหมดเพื่อสร้างและเปิดตัวบริการและประสบการณ์ผลิตภัณฑ์ AI ใหม่ และนำแบบจำลอง PyTorch จากการวิจัยไปสู่การผลิต.. เธอเป็นผู้ชนะ Women in IT – Silicon Valley – CTO แห่งปี 2019 วิทยากรที่โดดเด่นของ ACM และผู้นำทางความคิดในหัวข้อต่างๆ ตั้งแต่จริยธรรมใน AI, Deep Learning, Blockchain, IoT เธอหลงใหลในการส่งเสริมการใช้ AI for Good

ที่มา: https://aws.amazon.com/blogs/machine-learning/optimize-your-inference-jobs-using-dynamic-batch-inference-with-torchserve-on-amazon-sagemaker/

ประทับเวลา:

เพิ่มเติมจาก บล็อก AWS Machine Learning

ตั้งแต่การคาดการณ์ความต้องการไปจนถึงการสั่งซื้อ – แนวทางการเรียนรู้ของเครื่องอัตโนมัติด้วย Amazon Forecast เพื่อลดจำนวนสินค้าคงเหลือ สินค้าคงคลังส่วนเกิน และต้นทุน

โหนดต้นทาง: 1204383
ประทับเวลา: Mar 12, 2021