Обучение моделей с использованием GitLab CI/CD¶
Обучение моделей с использованием GitLab CI/CD¶
CI/CD (Continuous Integration, Continuous Delivery) — технология автоматизации тестирования и доставки новых модулей проекта заинтересованным сторонам.
Обучение моделей происходит в двух режимах: с использованием GPU и без него.
Содержание инструкции:
- Подготовка системы
- Пример файла
.gitlab-ci.yml
для веток с обучающими данными - Пример файла Dockerfile для базового контейнера Dockerfile-base
- Пример файла Dockerfile для контейнера обучения Dockerfile
Подготовка системы¶
Требуется следующее окружение:
- Linux Ubuntu 20 и выше;
- Docker 20.10 и выше;
- Docker Compose 2.21 и выше;
- GitLab Runner 15.7.1 и выше;
Для обучения с использованием GPU дополнительно потребуются:
- NVIDIA драйверы 525.147.05 и выше;
- NVIDIA Container Toolkit 1.13.0 и выше.
Обучение моделей без GPU¶
Шаг 1. Установка Docker¶
Руководство по установке Docker представлено на официальном портале документации проекта docs.docker.com.
Шаг 2. Установка GitLab Runner¶
GitLab Runner — приложение с открытым исходным кодом, выполняющее задания конвейера GitLab CI/CD на основе файла .gitlab-ci.yml. Руководство по установке представлено на официальном портале.
Шаг 3. Регистрация GitLab Runner¶
После установки GitLab Runner необходимо зарегистрировать его в проекте. Руководство по регистрации представлено на официальном портале.
Шаг 4. Создание .gitlab-ci.yml¶
Файл .gitlab-ci.yml определяет конфигурацию CI/CD конвейера. Подробнее о синтаксисе и использовании в официальной документации.
- Создайте файл .gitlab-ci.yml в основной (main) ветке проекта GitLab.
- Создайте файл .gitlab-ci.yml в каждой ветке, содержащей обучающие данные. Его структура отличается от структуры файла в основной ветке. Для его работы необходимо создать триггер сборочной линии. Для этого перейдите в Настройки → CI/CD → Триггеры сборочной линии и заполните недостающие параметры:
token
,branch
,trigger-url
.
Ознакомиться с примером заполнения файлов .gitlab-ci.yml можно в инструкциях:
- Пример файла .gitlab-ci.yml для основной ветки;
- Пример файла .gitlab-ci.yml для веток с обучающими данными.
Шаг 5. Создание Dockerfile¶
Механизм обучения моделей с использованием GitLab CI/CD основан на создании Docker-образов. Необходимо описать два файла Dockerfile, которые должны быть созданы в основной ветке проекта GitLab.
- Первый Dockerfile: отвечает за создание базового образа, содержащего все необходимые компоненты для обучения моделей. Создавайте его один раз и обновляйте только при необходимости изменения компонентов обучения.
- Второй Dockerfile: отвечает за обучение моделей. Основным образом будет базовый образ из первого Dockerfile. В процессе создания образа выполняется обучение модели. В результате получается образ NGINX, содержащий модель по адресу
/default
. Логи обучения доступны по адресу/logs.txt
.
Если вы правильно настроили файл .gitlab-ci.yml и Dockerfile, то в реестре контейнеров вашего проекта в разделе Пакеты и реестры → Реестр контейнеров появится контейнер с моделью, который будет называться <название ветки>-<время создания>
.
Ознакомиться с примером заполнения файлов Dockerfile можно в инструкциях:
- Пример файла Dockerfile для базового контейнера Dockerfile-base;
- Пример файла Dockerfile для контейнера обучения Dockerfile.
Шаг 6. Добавление модели в WiseBot¶
После обучения и создания образа с моделью необходимо добавить его в docker-compose.yml
.
wisebot-model:
image: <название образа>
container_name: wisebot-model
restart: always
labels:
- 'com.centurylinklabs.watchtower.enable=true'
wisebot-model-watchtower:
image: containrrr/watchtower
container_name: wisebot-model-watchtower
volumes:
- /var/run/docker.sock:/var/run/docker.sock
command: --interval 30 --label-enable
- wisebot-model: предоставляет модель.
- wisebot-model-watchtower: автоматически обновляет образ
wisebot-model
при изменении в реестре образов GitLab.
Запустите эти образы командой:
Отредактируйте настройки WiseBot в разделе Настройки → Конечные точки. Добавьте следующие строки, заменив необходимые параметры:
Перезапустите один из образов командой:
Обучение моделей с использованием GPU¶
Ранее описанные шаги подразумевают обучение без использования GPU. Для обучения с использованием GPU необходимо установить дополнительные пакеты и драйверы, а также настроить их.
Шаг 1. Установка драйверов для GPU NVIDIA¶
Установка драйверов для GPU является важным этапом. Подробные инструкции доступны в официальной документации ubuntu.com. Установка CUDA не обязательна.
Шаг 2. Установка NVIDIA Container Toolkit¶
NVIDIA Container Toolkit позволяет управлять доступом к графическим ресурсам и GPU, обеспечивая оптимальную производительность при работе с графическими интерфейсами внутри контейнера. Это расширение для Docker позволяет запускать контейнеры с использованием GPU и предоставляет доступ к драйверам и библиотекам Nvidia. Благодаря этому разработчики и исследователи могут обучать нейронные сети, выполнять рендеринг 3D графики и решать другие задачи, требующие мощного аппаратного обеспечения, непосредственно внутри контейнеров.
Об установке читайте на официальном портале документации docs.nvidia.com.
Проверьте правильность установки командой:
Шаг 3. Конфигурация GitLab Runner для использования GPU¶
Для использования GPU при сборке образа модели необходимо настроить GitLab Runner. В зависимости от способа установки и запуска конфигурация может различаться. Подробнее об этом можно прочитать на официальном портале документации docs.gitlab.com.
Пример файла .gitlab-ci.yml для основной ветки¶
stages:
- build
- push
- test
before_script:
- docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
Build base:
stage: build
tags:
- botya-runner
only:
variables:
- $BUILD_BASE == "true"
script:
- docker pull $CI_REGISTRY_IMAGE:base || true
- >
docker build
--pull
--cache-from $CI_REGISTRY_IMAGE:base
--tag $CI_REGISTRY_IMAGE:base
-f Dockerfile-base
.
- docker push $CI_REGISTRY_IMAGE:base
Build latest:
stage: build
tags:
- botya-runner
only:
variables:
- $BUILD_RELEASE == "false" && $BUILD_BRANCH_NAME != "" && $BUILD_BRANCH_NAME != "main"
before_script:
- nvidia-smi
- docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
- export BUILD_VERSION=${BUILD_BRANCH_NAME}-$(date +%Y-%m-%d-%H%M)
script:
- echo "Building and pushing $BUILD_VERSION version for $BUILD_BRANCH_NAME branch"
- docker build --no-cache --tag $CI_REGISTRY_IMAGE:$BUILD_VERSION --build-arg BRANCH_NAME=$BUILD_BRANCH_NAME .
- docker push $CI_REGISTRY_IMAGE:$BUILD_VERSION
- docker rmi $CI_REGISTRY_IMAGE:$BUILD_VERSION
- echo BUILD_VERSION=$BUILD_VERSION >> build.env
artifacts:
reports:
dotenv: build.env
Push latest:
stage: push
tags:
- botya-runner
only:
variables:
- $BUILD_RELEASE == "false" && $BUILD_BRANCH_NAME != "" && $BUILD_BRANCH_NAME != "main"
variables:
GIT_STRATEGY: none
before_script:
- docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
- export LATEST_VERSION=${BUILD_BRANCH_NAME}-latest
script:
- echo "Pulling and pushing $LATEST_VERSION version for $BUILD_BRANCH_NAME branch"
- docker pull $CI_REGISTRY_IMAGE:$BUILD_VERSION
- docker tag $CI_REGISTRY_IMAGE:$BUILD_VERSION $CI_REGISTRY_IMAGE:$LATEST_VERSION
- docker push $CI_REGISTRY_IMAGE:$LATEST_VERSION
- docker rmi $CI_REGISTRY_IMAGE:$BUILD_VERSION $CI_REGISTRY_IMAGE:$LATEST_VERSION
Push release:
stage: push
tags:
- botya-runner
only:
variables:
- $BUILD_RELEASE == "true" && $BUILD_BRANCH_NAME != "" && $BUILD_BRANCH_NAME != "main"
variables:
GIT_STRATEGY: none
before_script:
- docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
- export LATEST_VERSION=${BUILD_BRANCH_NAME}-latest
- export RELEASE_VERSION=${BUILD_BRANCH_NAME}-release
script:
- echo "Creating release $LATEST_VERSION version for $BUILD_BRANCH_NAME branch"
- docker pull $CI_REGISTRY_IMAGE:$LATEST_VERSION
- docker tag $CI_REGISTRY_IMAGE:$LATEST_VERSION $CI_REGISTRY_IMAGE:$RELEASE_VERSION
- docker push $CI_REGISTRY_IMAGE:$LATEST_VERSION
- docker rmi $CI_REGISTRY_IMAGE:$RELEASE_VERSION $CI_REGISTRY_IMAGE:$LATEST_VERSION
Пример файла .gitlab-ci.yml
для веток с обучающими данными¶
trigger_build_model:
stage: build
tags:
- botya-runner
variables:
GIT_STRATEGY: none
only:
variables:
- $CI_COMMIT_MESSAGE !~ /release/i && $CI_COMMIT_MESSAGE !~ /ci skip/i
script:
- |
curl -X POST --fail --form token=<token> --form ref=main \
--form 'variables[BUILD_RELEASE]=false' --form 'variables[BUILD_BRANCH_NAME]=<branch>' \
<trigger-url>
trigger_release:
stage: build
tags:
- botya-runner
variables:
GIT_STRATEGY: none
only:
variables:
- $CI_COMMIT_MESSAGE =~ /release/i && $CI_COMMIT_MESSAGE !~ /ci skip/i
script:
- |
curl -X POST --fail --form token=<token> --form ref=main \
--form "variables[BUILD_RELEASE]=true" --form "variables[BUILD_BRANCH_NAME]=<branch>" \
<trigger-url>
Пример файла Dockerfile для базового контейнера Dockerfile-base¶
FROM registry.digtlab.ru/kassistant/wisebot-datasets:cuda-10.1-cudnn7-runtime-ubuntu18.04
ENV WISEBOT_PATH=/app/wisebot
RUN mkdir -p $WISEBOT_PATH
RUN apt update && \
apt install -y software-properties-common git mc curl && \
add-apt-repository -y ppa:deadsnakes/ppa && \
apt update && \
apt install -y python3.8 python3.8-dev && \
update-alternatives --install /usr/bin/python python /usr/bin/python3.8 10 && \
apt install -y python3-pip && \
python -m pip install --upgrade pip
RUN pip install git+https://github.com/botfront/rasa-for-botfront pypred sgqlc protobuf==3.20.*
RUN git clone --depth 1 https://github.com/botfront/rasa-for-botfront /app/rasa-for-botfront
RUN cp -R /app/rasa-for-botfront/rasa_addons /usr/local/lib/python3.8/dist-packages
RUN rm -r /app/rasa-for-botfront
RUN rasa telemetry disable
WORKDIR $WISEBOT_PATH
CMD ["/bin/bash"]
Пример файла Dockerfile для контейнера обучения Dockerfile¶
# Train stage
FROM registry.digtlab.ru/kassistant/wisebot-datasets:base as train
ENV PYTHONPATH=/custom_components
RUN mkdir $PYTHONPATH
RUN git clone --depth 1 <rasa-custom-components-url> -b main $WISEBOT_PATH/rasa-custom-components
RUN cp -r $WISEBOT_PATH/rasa-custom-components/custom_components/. $PYTHONPATH/
RUN rm -r $WISEBOT_PATH/rasa-custom-components
RUN pip install python-Levenshtein
ARG BRANCH_NAME=marsu
RUN git clone --depth 1 <datasets-url>-b $BRANCH_NAME $WISEBOT_PATH
RUN rasa train --debug --fixed-model-name default 2>&1 | tee logs.txt
# Deploy stage
FROM flashspys/nginx-static
COPY --from=train /app/wisebot/models/default.tar.gz /static/default
COPY --from=train /app/wisebot/logs.txt /static/logs.txt
EXPOSE 80
STOPSIGNAL SIGTERM
CMD ["nginx", "-g", "daemon off;"]