در دنیای گسترده فناوری که نوآوری به عنوان محرک اصلی پیشرفت مطرح است، کانتینر (Container) به عنوان یک عامل اساسی نمایان شده است. این فناوری با امکان بستهبندی برنامهها و وابستگیهایشان به واحدهای قابل حمل و سبک، تغییرات چشمگیری در زمینه توسعه نرمافزار و یادگیری ماشین به وجود آورده است.
داکر (Docker) و کوبرنتیز (Kubernetes) به عنوان دو ابزار مهم در این تحول (ایجاد کانتینر) شناخته می شوند. در دنیای پرچالش یادگیری ماشین که شفافیت، پیچیدگی و قابلیت مقیاسپذیری مدل ها از اهمیت بالایی برخوردار است، کانتینرها به عنوان یک راهکار ارزشمند معرفی شده اند.
در این مقاله، با هم یک سفر جذاب به دنیای کانتینرها خواهیم داشت و به همراه آن با عملکرد و قابلیت های داکر و کوبرنتیز آشنا خواهیم شد. همچنین، سعی براین خواهد بود که ارتباط و دلایل استفاده از این ابزار برای بهبود و مقیاس پذیری مدل های یادگیری ماشین و علوم داده آشکار کنیم.
کانتینر چیست؟
کانتینر به عنوان یک واحد نرمافزار استاندارد عمل میکند. کانتینر کد و وابستگی های آن را داخل یک جعبه ای قرار می دهد. این امرباعث می شود که برنامه نوشته شده بتواند به صورت کارآمد و قابل اعتماد در محیط های سخت افزاری متفاوتی به یک شکل اجرا شود. این واحد نرمافزاری شامل یک بسته سبک و مستقل است که به عنوان ایمج (Image) شناخته میشود. در این ایمج، تمام مؤلفههای لازم برای اجرای یک برنامه کاربردی، از جمله کد، زمان اجرا، ابزارهای سیستم، کتابخانهها و تنظیمات، گنجانده شده است.
ویژگی اساسی کانتینرها، ایزوله بودن آنها است. این به این معناست که هر کانتینر به صورت مستقل عمل کرده و ارتباطی با دیگر کانتینرها ندارد. هر کانتینر دارای نرمافزارها، کتابخانهها و تنظیمات جداگانه ای است. توسعه دهندگان میتوانند با استفاده از کانتینرها، محیط اجرای برنامههای خود را به صورت کامل کنترل کنند. این واحدها از طریق کانالهای تعریف شده بهخوبی با یکدیگر ارتباط برقرار میکنند و همزمان توسط یک هسته سیستم عامل اجرا میشوند. به این ترتیب، استفاده از منابع بهینه شده و بهترین استفاده از فضای کاربر امکانپذیر میشود. چندین کانتینر میتوانند روی یک سیستم عامل کنترل و مدیریت شوند.

دلایل استفاده از کانتینر چیست؟
کانتینرها در زمینه یادگیری ماشین به دلیل مزایای بیشماری از اهمیت بالایی برخوردارند. در زیر، برخی از مزایای کلیدی کانتینرسازی در این حوزه آورده شده است:
1. تکرارپذیری و قابل حمل:
کانتینرها کل پشته نرمافزاری را در خود جای میدهند و این امکان را فراهم میکنند که مدلهای یادگیری ماشین را به راحتی و با قابلیت تکرار در محیطهای مختلف استقرار داد. این ویژگی از اهمیت بسیاری برخوردار است زیرا اجرای یک مدل در محیط توسعه، آزمون، و تولید میتواند به راحتی و بدون مشکلات انجام شود.
2.انزوا و مدیریت وابستگی:
کانتینرها وابستگیها را به صورت جداگانه مدیریت میکنند. این ایزولهسازی از تضادها جلوگیری میکند و مدیریت وابستگیها را به سادگی انجام میدهد. همچنین، این ویژگی امکان کار با نسخههای مختلف کتابخانهها و ابزارها را بدون نگرانی از تداخل، فراهم میکند.
3. مقیاسپذیری و مدیریت منابع:
پلتفرمهای ارکستراسیون کانتینری، مانند Kubernetes، به بهترین شکل از منابع استفاده میکنند و امکان مقیاسپذیری برای بارهای کاری یادگیری ماشین را فراهم میسازند. این ابزارها به بهبود عملکرد و بهینهسازی هزینهها کمک میکنند، زیرا اجازه میدهند که بارهای کاری را به بهترین شکل بر روی میزبانهای مختلفی که توسط کانتینرها کنترل میشوند، توزیع کرد.
چرا از داکر استفاده کنیم؟
داکر، که به عنوان پیشگام در حوزه ایجاد کانتینر شناخته میشود، واقعاً چشمانداز توسعه و استقرار نرمافزار را به شکل اساسی تغییر داده است. داکر در هسته خود یک بستر برای ایجاد و مدیریت کانتینرهایی با ساختار سبک وزن و ایزوله را فراهم میکند. همچنین داکر تمامی جزئیات برنامهها و وابستگیهای آنها را نیز داخل کانتینر قرار می دهد.
استفاده از کانتینرها توسط داکر، که بستههای مستقلی هستند و شامل همه عوامل مورد نیاز برای اجرای یک برنامه از جمله کد، کتابخانههای سیستم و وابستگیها میشوند، به یک ابتکار کاملاً جدید در توسعه نرمافزار منجر شده است. داکر ایمج (Docker Image) را میتوان به سهولت ایجاد کرد، به اشتراک گذاشت و مورد استفاده قرار داد. این ویژگی به توسعهدهندگان این اختیار را میدهد که به جای غرق شدن در پیچیدگیهای پیکربندی و فرآیندهای استقرار، بر روی تولید برنامهها و توسعه آنها تمرکز کنند.
نحوه ساخت فایل داکر در پروژه
کانتینرسازی عملی است که با کپسوله کردن یک برنامه و وابستگیهای آن درون یک ظرف داکر، فرآیند استقرار و اجرای برنامه را بسیار ساده و کارآمد میکند. این مرحله با تولید یک فایل داکر در دایرکتوری پروژه شروع میشود. فایل داکر، یک سند متنی است که دستورالعملهای مورد نیاز برای ساخت یک تصویر داکر را شامل میشود. این فایل، به عنوان یک نقشه برای ایجاد یک محیط شامل کد برنامه، وابستگیها، و تنظیمات پیکربندی عمل میکند.
# Use the official Python base image with version 3.9
FROM python:3.9
# Set the working directory within the container
WORKDIR /app
# Copy the requirements file to the container
COPY requirements.txt .
# Install the dependencies
RUN pip install -r requirements.txt
# Copy the application code to the container
COPY . .
# Set the command to run the application
CMD ["python", "app.py"]
این فایل داکر از یک ساختار ساده پیروی می کند. با مشخص کردن تصویر پایه به عنوان نسخه رسمی پایتون 3.9 شروع می شود. دایرکتوری کاری داخل کانتینر روی “/app” تنظیم شده است. فایل “requirements.txt” در کانتینر کپی می شود تا وابستگی های لازم با استفاده از دستورالعمل “RUN” نصب شود. سپس کد برنامه در ظرف کپی می شود. در نهایت، دستورالعمل “CMD” دستوری را تعریف می کند که هنگام اجرای یک کانتینر بر اساس این تصویر اجرا می شود، که معمولاً برنامه را با دستور python app.py شروع می کند.
ساخت Docker image از Dockerfile
هنگامی که یک فایل داکر را دارید، می توانید با اجرای دستور زیر در ترمینال، یک داکر ایمج بسازید. برای این کار باید داکر را روی کامپیوتر خود نصب کرده باشید.
docker build -t image-name:tag
اجرای این دستور ممکن است زمان زیادی ببرد. همانطور که داکر ایمج در حال ساخت است، log های مربوطه در ترمینال چاپ خواهد شد.
هنگامی که ایمج ساخته شد، می توانید دستور docker images را در ترمینال اجرا کنید تا تمامی ایمج های ایجاد شده بر روی سیستم خود را مشاهده کنید:

چرا از کوبرنتیز استفاده کنیم؟
در حالی که Docker انقلابی در کانتینرسازی ایجاد کرد، Kubernetes به عنوان ارکستراتور ظاهر شد که مدیریت یکپارچه و مقیاسبندی برنامههای کاربردی کانتینری را امکانپذیر میکرد. Kubernetes که اغلب با نام K8 شناخته میشود، استقرار، مقیاسبندی و مدیریت کانتینرها را در مجموعهای از گرهها خودکار میکند.
در هسته خود، Kubernetes مجموعه ای قوی از ویژگی ها را برای ارکستراسیون کانتینر فراهم می کند. این به توسعه دهندگان اجازه می دهد تا با استفاده از مانیفست های YAML وضعیت مورد نظر برنامه های خود را تعریف و اعلام کنند. سپس Kubernetes تضمین میکند که وضعیت مورد نظر حفظ میشود، به طور خودکار وظایفی مانند زمانبندی کانتینرها، مقیاسبندی برنامهها بر اساس تقاضا، و مدیریت سلامت و در دسترس بودن کانتینر را انجام میدهد.
با Kubernetes، توسعهدهندگان میتوانند بهطور یکپارچه برنامههای خود را برای مدیریت افزایش ترافیک و حجم کاری بدون نگرانی در مورد زیرساختهای زیربنایی، مقیاسبندی کنند. این یک رویکرد اعلامی برای مدیریت زیرساخت ارائه میکند و به توسعهدهندگان این امکان را میدهد تا به جای مدیریت پیچیدگیهای استقرار کانتینر، روی ایجاد و بهبود برنامههای خود تمرکز کنند.
درک اجزای Kubernetes برای یادگیری ماشین
Kubernetes چندین مؤلفه کلیدی را ارائه می دهد که برای استقرار و مدیریت مؤثر برنامه های یادگیری ماشینی حیاتی هستند. این اجزاء شامل Pods، Services و Deployments هستند.
1. غلاف (Pod)
در Kubernetes، غلاف کوچکترین واحد استقرار است. این یک نمونه واحد از یک فرآیند در حال اجرا در داخل خوشه را نشان می دهد. در زمینه یادگیری ماشینی، یک غلاف به طور معمول یک مدل ML محفظه یا یک جزء خاص از گردش کار ML را در بر می گیرد. پادها می توانند از یک یا چند کانتینر تشکیل شوند که با هم کار می کنند و شبکه و منابع ذخیره سازی یکسانی را به اشتراک می گذارند.
2. خدمات (Services)
خدمات ارتباط و شبکه بین پادهای مختلف را امکان پذیر می کند. یک سرویس یک نقطه پایانی شبکه پایدار را برای دسترسی به یک یا چند Pod تعریف می کند. در سناریوهای یادگیری ماشین، از Services می توان برای نمایش مدل ها یا اجزای ML به عنوان نقطه پایانی برای ورودی داده یا استنتاج مدل استفاده کرد. آنها مکانیسمهای متعادلسازی بار و کشف را ارائه میکنند و تعامل سایر برنامهها یا سرویسها با اجزای ML را آسانتر میکنند.
3. استقرار (Deployment)
استقرارها روشی اعلامی برای مدیریت ایجاد و مقیاسبندی Pods ارائه میکنند. Deployment تضمین می کند که تعداد مشخصی از کپی های یک Pod همیشه در حال اجرا هستند. این امکان را برای مقیاسبندی آسان، بهروزرسانیهای چرخشی و بازگرداندن برنامهها فراهم میکند. استقرارها به ویژه برای مدیریت بارهای کاری ML مفید هستند که به مقیاس بندی پویا بر اساس تقاضا یا زمانی که نیاز به به روز رسانی بدون نیاز به خرابی اعمال می شود، مفید هستند.
نوشتن یک فایل پیکربندی Kubernetes برای یک پروژه ML
برای استقرار یک پروژه ML در Kubernetes، از یک فایل پیکربندی Kubernetes، که معمولاً با فرمت YAML نوشته می شود، استفاده می شود. این فایل وضعیت مورد نظر برنامه را مشخص می کند، از جمله اطلاعات مربوط به Pods، Services، Deployments و دیگر منابع Kubernetes.
فایل پیکربندی کانتینرها، متغیرهای محیطی، منابع مورد نیاز و جنبه های شبکه مورد نیاز برای اجرای برنامه ML را شرح می دهد. تعداد مورد نظر ماکت، اتصالات پورت، مونتاژهای حجمی، و هر گونه پیکربندی خاص منحصر به فرد برای پروژه ML را مشخص می کند.
نمونه پیکربندی فایل yaml برای راه اندازی Kubernetes
apiVersion: v1
kind: Pod
metadata:
name: ml-model-pod
spec:
containers:
- name: ml-model-container
image: your-image-name:tag
ports:
- containerPort: 8080
env:
- name: ENV_VAR_1
value: value1
- name: ENV_VAR_2
value: value2
در این مثال از عناصر مختلفی برای پیکربندی یک Pod در Kubernetes استفاده شده است. اینها شامل مشخص کردن نسخه Kubernetes API، تعریف نوع منبع به عنوان یک Pod، ارائه ابرداده مانند نام Pod، و تشریح مشخصات Pod در بخش spec است.
Kubernetes برای یادگیری ماشین
هنگامی که فایل پیکربندی Kubernetes تعریف شد، استقرار یک مدل ML یک فرآیند ساده است. با استفاده از ابزار خط فرمان kubectl، فایل پیکربندی را می توان در خوشه Kubernetes اعمال کرد تا Pods، Services و Deployments مشخص شده را ایجاد کند.
Kubernetes با ایجاد و مدیریت خودکار منابع مورد نیاز، اطمینان حاصل می کند که وضعیت مطلوب به دست می آید. این شامل زمانبندی Pods بر روی گرههای مناسب، مدیریت شبکه، و ایجاد تعادل بار برای خدمات است.
Kubernetes در مقیاسبندی و مدیریت بارهای کاری ML سرآمد است. با مقیاس افقی، کپی های بیشتری از Pods را می توان به راحتی برای رسیدگی به تقاضای افزایش یافته یا موازی کردن محاسبات ML ایجاد کرد. Kubernetes به طور خودکار توزیع بار در Pods را مدیریت می کند و استفاده کارآمد از منابع را تضمین می کند.
جمع بندی
Containerization که توسط Docker و Kubernetes ارائه می شود، با ارائه مزایا و قابلیت های متعدد، زمینه یادگیری ماشین را متحول کرده است. Docker بستری را برای ایجاد و مدیریت کانتینرهای سبک وزن و ایزوله فراهم می کند که برنامه ها و وابستگی های آنها را در بر می گیرد. این فرآیند استقرار را ساده می کند و به توسعه دهندگان این امکان را می دهد که به جای رویارویی با پیکربندی های پیچیده، روی ساخت برنامه ها تمرکز کنند.
از طرف دیگر، Kubernetes به عنوان ارکستراتور عمل می کند که استقرار، مقیاس بندی و مدیریت برنامه های کاربردی کانتینری را خودکار می کند. تضمین میکند که وضعیت مطلوب برنامه حفظ میشود، وظایفی مانند زمانبندی کانتینرها، مقیاسبندی برنامهها بر اساس تقاضا را انجام میدهد و سلامت و در دسترس بودن کانتینر را مدیریت میکند. Kubernetes استفاده کارآمد از منابع را امکانپذیر میکند و اجازه میدهد مقیاس یکپارچه بارهای کاری یادگیری ماشین را انجام دهد و رویکردی اعلامی برای مدیریت زیرساخت ارائه میدهد.
ترکیب Docker و Kubernetes یک راه حل قدرتمند برای مدیریت برنامه های یادگیری ماشین ارائه می دهد. Docker قابلیت تکرار، قابلیت حمل و مدیریت وابستگی آسان را فراهم می کند، در حالی که Kubernetes مقیاس بندی کارآمد، مدیریت منابع و هماهنگ سازی کانتینرها را امکان پذیر می کند. آنها با هم به سازمانها اجازه میدهند تا پتانسیل کامل یادگیری ماشین را به روشی مقیاسپذیر و قابل اعتماد باز کنند.
منبع:
https://www.datacamp.com/tutorial/containerization-docker-and-kubernetes-for-machine-learning