کارهای استنتاج خود را با استفاده از استنتاج دسته ای پویا با TorchServe در Amazon SageMaker بهینه کنید

گره منبع: 1884601

در یادگیری عمیق، پردازش دسته ای به تغذیه چند ورودی به یک مدل اشاره دارد. اگرچه در طول آموزش ضروری است، اما مدیریت هزینه و بهینه سازی توان عملیاتی در طول زمان استنتاج نیز می تواند بسیار مفید باشد. شتاب دهنده های سخت افزاری برای موازی سازی بهینه شده اند و دسته بندی به اشباع ظرفیت محاسباتی کمک می کند و اغلب منجر به توان عملیاتی بالاتر می شود.

بچینگ می تواند در چندین سناریو در طول استقرار مدل در تولید مفید باشد. در اینجا ما آنها را به طور کلی به دو مورد استفاده دسته بندی می کنیم:

  • برنامه های بلادرنگ که در آن چندین درخواست استنتاج از مشتریان مختلف دریافت می شود و به صورت پویا دسته بندی می شوند و به مدل سرویس دهی می شوند. تأخیر معمولاً در این موارد استفاده مهم است.
  • برنامه‌های آفلاین که در آن‌ها چندین ورودی یا درخواست در سمت مشتری دسته‌بندی می‌شوند و به مدل ارائه‌دهنده ارسال می‌شوند. توان عملیاتی بالاتر اغلب هدف این موارد استفاده است که به مدیریت هزینه کمک می کند. موارد استفاده مثال شامل تجزیه و تحلیل ویدئو و ارزیابی مدل است.

آمازون SageMaker دو گزینه محبوب برای کارهای استنتاج شما ارائه می دهد. برای برنامه‌های بلادرنگ، میزبانی SageMaker از TorchServe به عنوان کتابخانه سرویس‌دهی باطن استفاده می‌کند که دسته‌بندی پویا درخواست‌های دریافت‌شده را مدیریت می‌کند. برای برنامه های آفلاین، می توانید از کارهای تبدیل دسته ای SageMaker استفاده کنید. در این پست، نمونه‌ای از هر گزینه را بررسی می‌کنیم تا به شما در شروع کار کمک کنیم.

زیرا TorchServe به صورت بومی است با SageMaker یکپارچه شده است از طریق جعبه ابزار استنتاج PyTorch SageMaker، می توانید به راحتی یک مدل PyTorch را در TorchServe با استفاده از SageMaker Hosting مستقر کنید. همچنین ممکن است مواقعی وجود داشته باشد که لازم باشد محیط خود را با استفاده از تصاویر سفارشی Docker بیشتر سفارشی کنید. در این پست، ابتدا نحوه استقرار یک نقطه پایانی بلادرنگ را با استفاده از جعبه ابزار استنتاج بومی SageMaker PyTorch و پیکربندی اندازه دسته برای بهینه‌سازی توان عملیاتی نشان می‌دهیم. در مثال دوم، نحوه استفاده از یک تصویر Docker سفارشی برای پیکربندی تنظیمات TorchServe پیشرفته که به عنوان متغیر محیطی برای بهینه‌سازی کار استنتاج دسته‌ای شما در دسترس نیستند را نشان می‌دهیم.

بهترین روش ها برای استنتاج دسته ای

پردازش دسته‌ای می‌تواند توان عملیاتی را افزایش دهد و منابع شما را بهینه کند، زیرا به تکمیل تعداد بیشتری از استنتاج‌ها در مدت زمان معینی به هزینه تأخیر کمک می‌کند. برای بهینه سازی استقرار مدل برای توان بالاتر، دستورالعمل کلی این است که اندازه دسته را تا زمانی که توان کاهش یابد افزایش دهید. این اغلب برای برنامه‌های آفلاین مناسب است، جایی که چندین ورودی (مانند فریم‌های ویدیو، تصاویر یا متن) برای دریافت خروجی‌های پیش‌بینی دسته‌بندی می‌شوند.

برای کاربردهای بلادرنگ، تأخیر اغلب یک نگرانی اصلی است. یک مبادله بین توان عملیاتی بالاتر و افزایش اندازه دسته و تاخیر وجود دارد. ممکن است لازم باشد در صورت نیاز تنظیم کنید تا SLA تأخیر خود را برآورده کنید. از نظر بهترین روش‌ها در فضای ابری، هزینه به ازای تعداد معینی استنباط، راهنمای مفیدی برای تصمیم‌گیری آگاهانه است که نیازهای کسب‌وکار شما را برآورده می‌کند. یکی از عوامل موثر در مدیریت هزینه، انتخاب شتاب دهنده مناسب است. برای اطلاعات بیشتر ببین بهترین شتاب دهنده هوش مصنوعی و تلفیقی مدل را برای استنتاج بینایی کامپیوتری با Amazon SageMaker انتخاب کنید.

TorchServe دسته بندی پویا در SageMaker

TorchServe کتابخانه بومی PyTorch برای ارائه مدل ها در تولید در مقیاس است. این یک توسعه مشترک از فیس بوک و 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 را تعریف کنید. می‌توانید بارگذاری مدل سفارشی، استنتاج، و منطق پیش‌پردازش و پس‌پردازش را در یک اسکریپت که به‌عنوان نقطه ورودی به PyTorch SageMaker ارسال می‌شود، اضافه کنید (به مثال کد زیر مراجعه کنید). از طرف دیگر، می توانید از یک کانتینر سفارشی برای استقرار مدل های خود استفاده کنید. برای اطلاعات بیشتر ببین سرور مدل 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 S3). inference.py شبیه به کنترل کننده سفارشی TorchServe است. چندین توابع دارد که می توانید آنها را نادیده بگیرید تا مقدار اولیه مدل، پیش پردازش و پس پردازش درخواست های دریافتی و منطق استنتاج را تطبیق دهید.

در زیر دفتر یادداشت نمونه کاملی از استقرار مدل BERT Hugging Face را نشان می دهد.

اگر به یک کانتینر سفارشی نیاز دارید، می‌توانید یک تصویر ظرف سفارشی بسازید و آن را به آن فشار دهید رجیستری ظروف الاستیک آمازون مخزن (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 با استفاده از تصاویر محفظه جعبه ابزار استنتاج PyTorch بومی SageMaker، و نحوه استفاده از کانتینرهای سفارشی برای موارد استفاده که به تنظیمات پیکربندی پیشرفته TorchServe نیاز دارند، ارائه داد.

همانطور که TorchServe برای رفع نیازهای جامعه PyTorch به تکامل خود ادامه می‌دهد، ویژگی‌های جدیدی در SageMaker ادغام می‌شوند تا راه‌های کارآمدی را برای ارائه مدل‌ها در تولید ارائه دهند. برای اطلاعات بیشتر، بررسی کنید TorchServe GitHub مخزن و نمونه های SageMaker.


درباره نویسنده

فی نگوین یک معمار راه حل در AWS است که به مشتریان در سفر ابری خود با تمرکز ویژه بر دریاچه داده، تجزیه و تحلیل، فناوری های معناشناسی و یادگیری ماشین کمک می کند. در اوقات فراغت، می توانید او را در حال دوچرخه سواری به محل کار، مربیگری تیم فوتبال پسرش یا لذت بردن از طبیعت گردی با خانواده اش بیابید.

نیکیل کولکارنی یک توسعه‌دهنده نرم‌افزار با یادگیری ماشینی AWS است که بر روی کارآمدتر کردن بارهای کاری یادگیری ماشین در فضای ابری تمرکز دارد و یکی از سازنده‌های AWS Deep Learning Containers برای آموزش و استنتاج است. او مشتاق سیستم های یادگیری عمیق توزیع شده است. در خارج از محل کار، او از خواندن کتاب، بازی با گیتار و درست کردن پیتزا لذت می برد.

حمید شجاعی یک مهندس شریک در Pytorch است که روی بهینه‌سازی و ارائه مدل با عملکرد بالا OSS کار می‌کند. حمید دارای مدرک دکترای بینایی کامپیوتر است و به عنوان محقق در آزمایشگاه های چند رسانه ای در استرالیا، مالزی و سرپرست NLP در Opus.ai کار کرده است. او دوست دارد راه حل های ساده تری برای مشکلات سخت پیدا کند و در اوقات فراغت خود از علاقه مندان به هنر است.

گیتا چاوهان رهبری مهندسی شریک هوش مصنوعی در Meta AI با تخصص در ساختن پلتفرم های توزیع شده انعطاف پذیر، ضد شکننده و در مقیاس بزرگ برای استارت آپ ها و Fortune 500s. تیم او با شرکای استراتژیک، رهبران یادگیری ماشین در سراسر صنعت و همه ارائه دهندگان خدمات ابری بزرگ برای ایجاد و راه‌اندازی خدمات و تجربیات محصول جدید هوش مصنوعی کار می‌کند. و مدل‌های PyTorch را از تحقیق به تولید می‌برد. او برنده جایزه Women in IT – Silicon Valley – CTO سال 2019، سخنران برجسته ACM و رهبر فکری در موضوعاتی از اخلاق در هوش مصنوعی، یادگیری عمیق، بلاک چین، اینترنت اشیا است. او مشتاق ترویج استفاده از AI for Good است.

منبع: https://aws.amazon.com/blogs/machine-learning/optimize-your-inference-jobs-using-dynamic-batch-inference-with-torchserve-on-amazon-sagemaker/

تمبر زمان:

بیشتر از وبلاگ یادگیری ماشین AWS