
Проблема "Працює на моїй машині"
Модель машинного навчання (ML), щоб бути корисною, повинна десь працювати. Це "десь" найімовірніше не ваша локальна машина. Модель, яка працює в продакшені, краща за ідеальну модель, яка ніколи не покидає вашу локальну машину. Однак продакшен-машина зазвичай відрізняється від тієї, на якій ви розробляли модель. Модель може не працювати, оскільки продакшен-машина не має всіх необхідних залежностей або вони іншої версії. Точне відтворення продакшен-машини є негнучким рішенням.
Що таке Docker та контейнери?
Docker – це інструмент, який допомагає створювати, керувати та запускати код і додатки в контейнерах. Контейнер – це невелике ізольоване обчислювальне середовище, в якому можна упакувати додаток з усіма його залежностями, наприклад, ML-модель з усіма необхідними бібліотеками. Це дозволяє не покладатися на те, що встановлено на хост-машині. Docker-контейнер відокремлює додатки від базової інфраструктури, дозволяючи упакувати ML-модель локально та перенести її в хмару.
Переваги використання Docker
Використання Docker має кілька переваг:
- Допомагає швидше доставляти нові моделі.
- Покращує відтворюваність.
- Спрощує співпрацю.
- Забезпечує однакові залежності незалежно від місця запуску контейнера.
- Гарантує, що модель може працювати будь-де і будь-коли.
Контейнери проти віртуальних машин
Контейнери та віртуальні машини (ВМ) відрізняються тим, як вони використовують ресурси хост-комп'ютера.
- Віртуальні машини є абстракцією фізичного обладнання, розділяючи один сервер на кілька. ВМ включає повну копію операційної системи (ОС), що займає більше місця.
- Контейнери є абстракцією на рівні додатків. Всі контейнери ділять ОС хоста, але працюють в ізольованих процесах. Оскільки контейнери не містять ОС, вони більш ефективно використовують базову систему та ресурси, зменшуючи накладні витрати.
Контейнери мають п'ять основних характеристик:
- Самодостатні: Ізолюють додаток від середовища/інфраструктури, не покладаючись на попередньо встановлені залежності хоста.
- Ізольовані: Мають мінімальний вплив на хост та інші контейнери.
- Незалежні: Можна керувати контейнерами незалежно; видалення одного не впливає на інші.
- Портативні: Ізолюють програмне забезпечення від апаратного, дозволяючи безперешкодно запускати на будь-якій машині та переміщувати між ними.
- Легкі: Ділять ОС хост-машини, не вимагаючи власної ОС, що зменшує необхідність розділення апаратних ресурсів.
Архітектура Docker
Docker використовує клієнт-серверну архітектуру, що складається з трьох основних частин:
- Docker-клієнт: Основний спосіб взаємодії з Docker через команди (наприклад,
docker run,docker build,docker pull,docker push). Він спілкується через REST API з Docker-демонами. - Docker-демон (сервер): Керує об'єктами Docker, такими як образи та контейнери. Він слухає запити Docker API та, залежно від запиту, створює, запускає та розповсюджує Docker-контейнери. Клієнт і демон можуть працювати на одній або різних системах.
- Docker-реєстр: Централізоване сховище для Docker-образів, що дозволяє ділитися ними та робити їх доступними для інших.
Створення Docker-контейнера: Покроковий посібник
Для створення Docker-контейнера необхідно виконати три кроки:
- Створити Dockerfile.
- Зібрати Docker Image з Dockerfile.
- Запустити Docker Image для створення Docker-контейнера.
Dockerfile: Інструкції для збірки
Dockerfile – це текстовий файл, що містить інструкції для збірки Docker Image. У ньому визначається вигляд додатка та його залежності, а також процес, який має запускатися при старті контейнера. Dockerfile складається з шарів, кожен з яких додає, видаляє або змінює попередній шар.
Деякі поширені інструкції Dockerfile:
FROM <image>: Вказує базовий образ.WORKDIR <path>: Встановлює робочий каталог.COPY <host-path><image-path>: Копіює файли з хоста в образ контейнера.RUN <command>: Виконує вказану команду.ENV <name><value>: Встановлює змінну середовища.EXPOSE <port-number>: Вказує порт, який образ бажає відкрити.USER <user-or-uid>: Встановлює користувача за замовчуванням.CMD ["<command>", "<arg1>"]: Встановлює команду за замовчуванням для запуску контейнера.
Docker Image: Шаблон для запуску
Docker Image – це шаблон лише для читання з інструкціями для запуску Docker-контейнера. Образи є незмінними; після створення їх не можна модифікувати. Зміни можна додавати лише поверх існуючих образів або створювати новий образ. При перезбірці образу Docker перезбирає лише змінені шари, скорочуючи час збірки.
Docker Container: Запущений екземпляр
Docker Container – це запущений екземпляр Docker Image. Контейнер визначається образом та будь-якими параметрами конфігурації, наданими при його створенні або запуску. При видаленні контейнера всі зміни його внутрішнього стану також видаляються, якщо вони не зберігаються в постійному сховищі.
Приклад використання: Пакування ML-моделі
Як приклад, можна упакувати просту ML-модель з Flask у Docker-контейнер, щоб потім надсилати запити до контейнера та отримувати прогнози.
Підготовка моделі та залежностей
- Побудова моделі: Тренується проста модель RandomForestClassifier на наборі даних Iris з scikit-learn, а потім зберігається.
- Створення API: Створюється скрипт, який робить модель доступною через REST API за допомогою Flask.
- Файл
requirements.txt: Створюється файлrequirements.txt, що містить усі залежності, необхідні для виконання Python-файлу в контейнері.
Створення Dockerfile
Dockerfile для цього прикладу включає такі кроки:
- Визначення базового образу (наприклад, Python).
- Встановлення робочого каталогу.
- Оновлення файлів індексу пакетів.
- Копіювання та встановлення залежностей додатка.
- Копіювання вихідного коду та інших файлів, відкриття порту 8080 для взаємодії з ML-моделлю.
- Встановлення користувача (щоб контейнер не запускався як root).
- Визначення виконання файлу
example.pyпри запуску контейнера для створення Flask-сервера. Також можна створити файл.dockerignoreдля виключення каталогів з контексту збірки, що покращує швидкість збірки.
Збірка Docker Image
Після створення всіх необхідних файлів для збірки Docker Image, потрібно переконатися, що Docker Desktop запущено (перевіряється командою docker ps). Перебуваючи в тому ж каталозі, що й Dockerfile та requirements.txt, образ збирається командою:
docker build -t our_first_image .
-tвказує ім'я образу (наприклад,our_first_image)..вказує на збірку з поточного каталогу.
Після збірки образу можна:
- Переглянути образи:
docker image ls. - Переглянути історію створення образу:
docker image history <image_name>. - Відправити образ до реєстру:
docker push <image_name>.
Запуск Docker Container
Після збірки Docker Image можна запустити ML-модель у контейнері командою:
docker run -p 8080:8080 <image_name>
-p 8080:8080з'єднує локальний порт (8080) з портом у контейнері (8080). Якщо Docker Image не відкриває порт, можна просто запуститиdocker run <image_name>. Замістьimage_nameможна використовуватиimage_id.
Для взаємодії з запущеним контейнером (наприклад, надсилання запиту до ML-моделі):
curl X POST http://localhost:8080/invocations -H "Content-Type:application/json" -d @.path/to/sample_payload.json
Що це означає для розробників
Фахівці з даних можуть використовувати Docker для пакування своїх моделей машинного навчання разом з усіма залежностями, забезпечуючи їхню роботу в будь-якому середовищі. Це дозволяє уникнути проблем несумісності та прискорює розгортання моделей у продакшені.
Ключові факти
-
Docker вирішує проблему несумісності середовищ між розробкою та продакшеном для ML-моделей.
-
Контейнер – це ізольоване середовище, що пакує додаток з усіма залежностями.
-
Docker забезпечує портативність, відтворюваність та легшу співпрацю.
-
Контейнери легші за віртуальні машини, оскільки ділять ОС хоста.
-
Архітектура Docker включає клієнт, демон та реєстр.
Джерела
Джерело
Towards Data ScienceJonte Dancker
A Data Scientist’s Guide to Docker Containers8 квітня 2025 · оновлено 16 червня 2025
Попередні статті

Інженерія даних: затребувана професія, навички та кар'єрні шляхи
Інженерія даних є професією з високим попитом, що поєднує навички розробки програмного забезпечення, програмування та розширеної аналітики. Дізнайтеся про ключові технічні та нетехнічні навички, кар'єрні можливості та вплив ШІ на цю сферу.

Федеральні регулятори США вимагають прискореного доступу до електромереж для центрів обробки даних ШІ
Федеральна комісія з регулювання енергетики (FERC) зобов'язала шість регіональних операторів електромереж прискорити процеси підключення для великих споживачів електроенергії, зокрема центрів обробки даних ШІ, які прагнуть доступу до високовольтної передавальної системи.

Чому Data Scientist вивчив веб-розробку: Мотивація та покроковий посібник
Data Scientist ділиться своїм досвідом вивчення веб-розробки, пояснюючи чотири ключові причини та надаючи практичні поради щодо навчання, включаючи вибір курсів, технологій та інструментів для запуску проєктів.
Наступні статті

Чому дата-сайєнтист вивчає веб-розробку: 5 причин
Дата-сайєнтист ділиться п'ятьма ключовими причинами, чому він вирішив вивчати веб-розробку, щоб підвищити технічну майстерність, покращити портфоліо та ефективніше впроваджувати рішення.

Інженер великих даних: Роль, перспективи та шлях до кар'єри
Інженер великих даних відповідає за розробку, підтримку та аналіз систем для роботи з величезними обсягами інформації. Дізнайтеся про їхні обов'язки, необхідні навички, потенційний заробіток та кроки для початку кар'єри у цій затребуваній галузі.

Docker як основа для відтворюваної та масштабованої науки про дані та ML
Docker-контейнери забезпечують портативність та надійність проєктів у сфері науки про дані, усуваючи конфлікти версій та спрощуючи спільну роботу. Вони є ключовим елементом для MLOps та майбутнього AI/ML інфраструктури.