Что такое CML? Непрерывное машинное обучение (CML)-это инструмент CLI с открытым исходным кодом для реализации непрерывной интеграции и доставки (CI/CD) с акцентом на MLOP. Используйте его для автоматизации рабочих процессов разработки - включая обеспечение машин, обучение и оценку модели, сравнение экспериментов ML в истории проекта и мониторинг изменяющихся наборов данных.
CML может помочь обучать и оценивать модели, а затем генерировать визуальный отчет с результатами и метриками - автоматически по каждому запросу на привлечение.
Пример отчета для модели передачи нервного стиля.
Принципы CML:
❓ нужна помощь? Просто хотите поговорить о непрерывной интеграции для ML? Посетите наш канал Discord!
⏯ Проверьте нашу серию видео на YouTube для практических учебных пособий MLOPS с помощью CML!
Вам понадобится учетная запись Gitlab, Github или Bitbucket. Пользователи могут пожелать ознакомиться с действиями GitHub или Gitlab CI/CD. Здесь обсудим вариант использования GitHub.
Пожалуйста, посмотрите наши документы на CML с Gitlab CI/CD и, в частности, требование токена личного доступа.
Пожалуйста, посмотрите наши документы на CML с Bitbucket Cloud.
Ключевой файл в любом проекте CML - .github/workflows/cml.yaml :
name : your-workflow-name
on : [push]
jobs :
run :
runs-on : ubuntu-latest
# optionally use a convenient Ubuntu LTS + DVC + CML image
# container: ghcr.io/iterative/cml:0-dvc2-base1
steps :
- uses : actions/checkout@v3
# may need to setup NodeJS & Python3 on e.g. self-hosted
# - uses: actions/setup-node@v3
# with:
# node-version: '16'
# - uses: actions/setup-python@v4
# with:
# python-version: '3.x'
- uses : iterative/setup-cml@v1
- name : Train model
run : |
# Your ML workflow goes here
pip install -r requirements.txt
python train.py
- name : Write CML report
env :
REPO_TOKEN : ${{ secrets.GITHUB_TOKEN }}
run : |
# Post reports as comments in GitHub PRs
cat results.txt >> report.md
cml comment create report.md Мы полезны предоставляем CML и другие полезные библиотеки, предварительно установленные на наших пользовательских изображениях Docker. В приведенном выше примере, некомментирование полевого container: ghcr.io/iterative/cml:0-dvc2-base1 ) заставит бегун натянуть изображение CML Docker. На изображении уже есть Nodejs, Python 3, DVC и CML, установленные на базе Ubuntu LTS для удобства.
CML предоставляет ряд функций, которые помогут упаковать выходы рабочих процессов ML (включая числовые данные и визуализации о производительности модели) в отчет CML.
Ниже приведена таблица функций CML для написания отчетов об отметке и предоставления этих отчетов в вашу систему CI.
| Функция | Описание | Пример входов |
|---|---|---|
cml runner launch | Запустите бегуна локально или размещено облачным провайдером | Смотрите аргументы |
cml comment create | Вернуть отчет CML в качестве комментария в вашем рабочем процессе Gitlab/Github | <path to report> --head-sha <sha> |
cml check create | Вернуть отчет CML в качестве проверки в GitHub | <path to report> --head-sha <sha> |
cml pr create | Поделиться данными файлами в новую филиал и создать запрос на вытягивание | <path>... |
cml tensorboard connect | Вернуть ссылку на страницу tensorboard.dev | --logdir <path to logs> --title <experiment title> --md |
Команда cml comment create может использоваться для публикации отчетов. Отчеты CML написаны в Markdown (Github, Gitlab или Bitbucket вкуса). Это означает, что они могут содержать изображения, таблицы, форматированный текст, HTML -блоки, фрагменты кода и многое другое - действительно, что вы вкладываете в отчет CML, зависит от вас. Некоторые примеры:
? ️ Текст Напишите в свой отчет, используя любой метод, который вы предпочитаете. Например, скопируйте содержимое текстового файла, содержащего результаты обучения модели ML:
cat results.txt >> report.md ? ️ Изображения отображают изображения, используя Markdown или HTML. Обратите внимание, что если изображение является выходом вашего рабочего процесса ML (то есть оно производится вашим рабочим процессом), его можно загрузить и автоматически включать в ваш отчет CML. Например, если graph.png выводится с помощью python train.py , запустите:
echo "  " >> report.md
cml comment create report.md
️ Обратите внимание, что если вы используете gitlab, вам нужно будет создать токен личного доступа для этого примера для работы.
️ Все следующие шаги могут быть сделаны в интерфейсе браузера GitHub. Однако, чтобы следовать командам, мы рекомендуем клонировать вашу вилку на местную рабочую станцию:
git clone https://github.com/ < your-username > /example_cml.github/workflows/cml.yaml : name : model-training
on : [push]
jobs :
run :
runs-on : ubuntu-latest
steps :
- uses : actions/checkout@v3
- uses : actions/setup-python@v4
- uses : iterative/setup-cml@v1
- name : Train model
env :
REPO_TOKEN : ${{ secrets.GITHUB_TOKEN }}
run : |
pip install -r requirements.txt
python train.py
cat metrics.txt >> report.md
echo "" >> report.md
cml comment create report.md В выбранном редакторе текстового редактора редактируйте строку 16 train.py до depth = 5 .
Совершить и протолкнуть изменения:
git checkout -b experiment
git add . && git commit -m " modify forest depth "
git push origin experimentexperiment с main . Вскоре вы должны увидеть комментарий от github-actions появляющийся в запросе на вытягивание с вашим отчетом CML. Это является результатом функции cml send-comment в вашем рабочем процессе.
Это очередь рабочего процесса CML:
.github/workflows/cml.yaml запускается, иФункции CML позволяют вам отображать соответствующие результаты из рабочего процесса, таких как метрики производительности модели и визуализации - в проверках и комментариях GitHub. Какой рабочий процесс вы хотите запустить, и хотите поместить в свой отчет CML, решать вам.
Во многих проектах ML данные не хранятся в репозитории GIT, но должны быть загружены из внешних источников. DVC - это обычный способ донести данные в ваш бегун CML. DVC также позволяет визуализировать, как показатели различаются между коммитами, чтобы сделать такие отчеты:
Файл .github/workflows/cml.yaml используемый для создания этого отчета:
name : model-training
on : [push]
jobs :
run :
runs-on : ubuntu-latest
container : ghcr.io/iterative/cml:0-dvc2-base1
steps :
- uses : actions/checkout@v3
- name : Train model
env :
REPO_TOKEN : ${{ secrets.GITHUB_TOKEN }}
AWS_ACCESS_KEY_ID : ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY : ${{ secrets.AWS_SECRET_ACCESS_KEY }}
run : |
# Install requirements
pip install -r requirements.txt
# Pull data & run-cache from S3 and reproduce pipeline
dvc pull data --run-cache
dvc repro
# Report metrics
echo "## Metrics" >> report.md
git fetch --prune
dvc metrics diff main --show-md >> report.md
# Publish confusion matrix diff
echo "## Plots" >> report.md
echo "### Class confusions" >> report.md
dvc plots diff --target classes.csv --template confusion -x actual -y predicted --show-vega main > vega.json
vl2png vega.json -s 1.5 > confusion_plot.png
echo "" >> report.md
# Publish regularization function diff
echo "### Effects of regularization" >> report.md
dvc plots diff --target estimators.csv -x Regularization --show-vega main > vega.json
vl2png vega.json -s 1.5 > plot.png
echo "" >> report.md
cml comment create report.md
️ Если вы используете DVC с облачным хранилищем, обратите внимание на переменные среды для вашего формата хранения.
Есть много поддерживаемых поставщиков хранения. Вот несколько примеров для некоторых из наиболее часто используемых поставщиков:
# Github
env :
AWS_ACCESS_KEY_ID : ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY : ${{ secrets.AWS_SECRET_ACCESS_KEY }}
AWS_SESSION_TOKEN : ${{ secrets.AWS_SESSION_TOKEN }}
AWS_SESSION_TOKENявляется необязательным.
AWS_ACCESS_KEY_IDиAWS_SECRET_ACCESS_KEYтакже может использоватьсяcml runnerдля запуска экземпляров EC2. См. [Переменные среды].
env :
AZURE_STORAGE_CONNECTION_STRING :
${{ secrets.AZURE_STORAGE_CONNECTION_STRING }}
AZURE_STORAGE_CONTAINER_NAME : ${{ secrets.AZURE_STORAGE_CONTAINER_NAME }} env :
OSS_BUCKET : ${{ secrets.OSS_BUCKET }}
OSS_ACCESS_KEY_ID : ${{ secrets.OSS_ACCESS_KEY_ID }}
OSS_ACCESS_KEY_SECRET : ${{ secrets.OSS_ACCESS_KEY_SECRET }}
OSS_ENDPOINT : ${{ secrets.OSS_ENDPOINT }}
️ ОбычноGOOGLE_APPLICATION_CREDENTIALS- это путь файлаjson, содержащий учетные данные. Однако в действии эта секретная переменная является содержимым файла. Скопируйте содержимоеjsonи добавьте его в секрете.
env :
GOOGLE_APPLICATION_CREDENTIALS : ${{ secrets.GOOGLE_APPLICATION_CREDENTIALS }}
️ После настройки ваших учетных данных Google Drive вы найдете файлjsonпо адресуyour_project_path/.dvc/tmp/gdrive-user-credentials.json. Скопируйте его содержимое и добавьте его в качестве секретной переменной.
env :
GDRIVE_CREDENTIALS_DATA : ${{ secrets.GDRIVE_CREDENTIALS_DATA }} Действия GitHub выполняются на бегунах с GitHub, проведенными по умолчанию. Тем не менее, есть много веских причин использовать своих собственных бегунов: воспользоваться графическими процессорами, организовать общие вычислительные ресурсы вашей команды или тренироваться в облаке.
☝ Совет! Ознакомьтесь с официальной документацией GitHub, чтобы начать настройку собственного самостоятельного бегуна.
Когда рабочий процесс требует вычислительных ресурсов (таких как графические процессоры), CML может автоматически выделять облачные экземпляры с помощью cml runner . Вы можете развернуть экземпляры на AWS, Azure, GCP или Kubernetes.
Например, следующий рабочий процесс развертывает экземпляр g4dn.xlarge на AWS EC2 и обучает модель на экземпляре. После выполнения задания экземпляр автоматически отключается.
Вы можете заметить, что этот рабочий процесс очень похож на основной вариант использования выше. Единственное дополнение - cml runner и несколько переменных среды для передачи учетных данных ваших облачных сервисов в рабочий процесс.
Обратите внимание, что cml runner также автоматически перезагрузит ваши задания (будь то с 35-дневного тайм-аута рабочего процесса GitHub или прерывания экземпляра AWS EC2).
name : Train-in-the-cloud
on : [push]
jobs :
deploy-runner :
runs-on : ubuntu-latest
steps :
- uses : iterative/setup-cml@v1
- uses : actions/checkout@v3
- name : Deploy runner on EC2
env :
REPO_TOKEN : ${{ secrets.PERSONAL_ACCESS_TOKEN }}
AWS_ACCESS_KEY_ID : ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY : ${{ secrets.AWS_SECRET_ACCESS_KEY }}
run : |
cml runner launch
--cloud=aws
--cloud-region=us-west
--cloud-type=g4dn.xlarge
--labels=cml-gpu
train-model :
needs : deploy-runner
runs-on : [self-hosted, cml-gpu]
timeout-minutes : 50400 # 35 days
container :
image : ghcr.io/iterative/cml:0-dvc2-base1-gpu
options : --gpus all
steps :
- uses : actions/checkout@v3
- name : Train model
env :
REPO_TOKEN : ${{ secrets.PERSONAL_ACCESS_TOKEN }}
run : |
pip install -r requirements.txt
python train.py
cat metrics.txt > report.md
cml comment create report.md В приведенном выше рабочем процессе шаг deploy-runner запускает экземпляр EC2 g4dn.xlarge в регионе us-west . На шаге model-training проходит на недавно запускаемом экземпляре. См. [Переменные среды] ниже для получения подробной информации о необходимых secrets .
? Обратите внимание, что задания может использовать любой контейнер Docker! Чтобы использовать такие функции, как
cml send-commentс задания, единственное требование-установить CML.
Изображение CML Docker ( ghcr.io/iterative/cml или iterativeai/cml ) поставляется с Python, CUDA, git , node и другими предметами первой необходимости для науки о данных полного стека. Различные версии этих предметов первой необходимости доступны из разных тегов изображения. Конвенция о метке {CML_VER}-dvc{DVC_VER}-base{BASE_VER}{-gpu} :
{BASE_VER} | Включено программное обеспечение ( -gpu ) |
|---|---|
| 0 | Ubuntu 18.04, Python 2.7 (Cuda 10.1, Cudnn 7) |
| 1 | Ubuntu 20.04, Python 3.8 (Cuda 11.2, Cudnn 8) |
Например, iterativeai/cml:0-dvc2-base1-gpu , или ghcr.io/iterative/cml:0-dvc2-base1 .
Функция cml runner launch принимает следующие аргументы:
--labels One or more user-defined labels for
this runner (delimited with commas)
[string] [default: "cml"]
--idle-timeout Time to wait for jobs before
shutting down (e.g. "5min"). Use
"never" to disable
[string] [default: "5 minutes"]
--name Name displayed in the repository
once registered
[string] [default: cml-{ID}]
--no-retry Do not restart workflow terminated
due to instance disposal or GitHub
Actions timeout [boolean]
--single Exit after running a single job
[boolean]
--reuse Don't launch a new runner if an
existing one has the same name or
overlapping labels [boolean]
--reuse-idle Creates a new runner only if the
matching labels don't exist or are
already busy [boolean]
--docker-volumes Docker volumes, only supported in
GitLab [array] [default: []]
--cloud Cloud to deploy the runner
[string] [choices: "aws", "azure", "gcp", "kubernetes"]
--cloud-region Region where the instance is
deployed. Choices: [us-east,
us-west, eu-west, eu-north]. Also
accepts native cloud regions
[string] [default: "us-west"]
--cloud-type Instance type. Choices: [m, l, xl].
Also supports native types like i.e.
t2.micro [string]
--cloud-permission-set Specifies the instance profile in
AWS or instance service account in
GCP [string] [default: ""]
--cloud-metadata Key Value pairs to associate
cml-runner instance on the provider
i.e. tags/labels "key=value"
[array] [default: []]
--cloud-gpu GPU type. Choices: k80, v100, or
native types e.g. nvidia-tesla-t4
[string]
--cloud-hdd-size HDD size in GB [number]
--cloud-ssh-private Custom private RSA SSH key. If not
provided an automatically generated
throwaway key will be used [string]
--cloud-spot Request a spot instance [boolean]
--cloud-spot-price Maximum spot instance bidding price
in USD. Defaults to the current spot
bidding price [number] [default: -1]
--cloud-startup-script Run the provided Base64-encoded
Linux shell script during the
instance initialization [string]
--cloud-aws-security-group Specifies the security group in AWS
[string] [default: ""]
--cloud-aws-subnet, Specifies the subnet to use within
--cloud-aws-subnet-id AWS [string] [default: ""]
️ Вам необходимо будет создать токен личного доступа (PAT) с репозиторием для чтения/доступа к записи и привилегиями рабочего процесса. В примере рабочего процесса этот токен хранится какPERSONAL_ACCESS_TOKEN.
Если вам также необходимо предоставить учетные данные из ваших --cloud вычислений в качестве секретов. В приведенном выше примере требуются AWS_ACCESS_KEY_ID и AWS_SECRET_ACCESS_KEY (с привилегиями для создания и уничтожения экземпляров EC2).
Для AWS те же учетные данные также могут использоваться для настройки облачного хранилища.
CML Поддержка прокси через известные переменные среды http_proxy и https_proxy .
Это означает использование локальных машин в качестве самостоятельных бегунов. Функция cml runner launch используется для настройки локального самостоятельного бегуна. На локальной машине или локальном кластере графических процессоров установите CML в качестве пакета, а затем запустите:
cml runner launch
--repo= $your_project_repository_url
--token= $PERSONAL_ACCESS_TOKEN
--labels= " local,runner "
--idle-timeout=180Машина будет прослушать рабочие процессы из вашего репозитория проекта.
В приведенных выше примерах CML устанавливается действием setup-cml или предварительно установлен в пользовательском изображении Docker, вытянутом бегуном CI. Вы также можете установить CML в качестве пакета:
npm install --location=global @dvcorg/cml Вы можете использовать cml без узла, загрузив правильный автономный двоичный файл для вашей системы из секции активов выпусков.
Вам может потребоваться установить дополнительные зависимости для использования графиков DVC и команд Vega-Lite CLI:
sudo apt-get install -y libcairo2-dev libpango1.0-dev libjpeg-dev libgif-dev
librsvg2-dev libfontconfig-dev
npm install -g vega-cli vega-lite Установка пакета CML и Vega-Lite требует диспетчера пакетов Nodejs ( npm ), который поставляется с Nodejs. Инструкции по установке ниже.
uses: actions/setup-node@v3
with:
node-version: ' 16 'curl -sL https://deb.nodesource.com/setup_16.x | bash
apt-get update
apt-get install -y nodejsЭто некоторые примеры проектов с использованием CML.
? нужен похлопывание.