GitHub에 push되면 ABEJA Platform에서 학습이 달리는 구조를 만들어 보았다

12302 단어 CircleCIABEJAPlatform
이 기사는 ABEJA Platform Advent Calendar의 17 일째 기사입니다.

만나서 반가워서, ABEJA의 미노테라고합니다.
평소에는 Researcher로서 기계 학습 알고리즘의 연구 개발을 하고 있습니다.

엔지니어 여러분은 버전 관리에 GitHub 등을 사용한다고 생각합니다.
자신도 Deep Learning의 코드를 작성할 때는 기본적으로 GitHub의 리포지토리에서 작업을 합니다만, 코드를 쓰고 나면 바로 Platform에 배포하고 학습시키고 싶지요?
그때 ABEJA Platform과 GitHub가 잘 어울리면 기쁘지 않습니까? 나는 기쁘다.
그렇게 생각했기 때문에, 이번은 조금 자신의 업무로부터 멀리, GitHub에 push되었을 때에 ABEJA Platform에 마음대로 배포되어 학습이 달리는 구조를 만들어 보았습니다.

CircleCI에 프로젝트 추가



-라는 이유로 CircleCI를 사용하여 push했을 때 ABEJA Platform에 배포 해 보려고합니다.

우선, 연계하고 싶은 GitHub 리포지토리를 아래와 같이 구성합니다.
scripts 아래에 실제로 배포되는 코드 세트가 들어 있습니다.
.
├── .circleci/
│   └── config.yml
├── .gitignore
├── manage.py
├── requirements.txt
└── scripts/

다음으로 협력하고 싶은 GitHub의 리포지토리를 CircleCI에 등록합니다.


사실 CircleCI에서 프로젝트를 만드는 것은 처음입니다.

CircleCI 설정 파일 작성



그런 다음 .circleci/config.yml에 구성 파일을 씁니다.
유석에 브런치에 일일이 push될 때마다 학습이 달리는 것은 귀찮아서, 이번은 tag에 새로운 버젼이 릴리스되었을 때에 학습이 달리도록 설정했습니다.
실제로 작성한 config.yml은 다음과 같습니다.

.circleci/config.yml
# Python CircleCI 2.0 configuration file
#
# Check https://circleci.com/docs/2.0/language-python/ for more details
#
version: 2
jobs:
  deploy:
    docker:
      # specify the version you desire here
      # use `-browsers` prefix for selenium tests, e.g. `3.6.1-browsers`
      - image: circleci/python:3.6.1

      # Specify service dependencies here if necessary
      # CircleCI maintains a library of pre-built images
      # documented at https://circleci.com/docs/2.0/circleci-images/
      # - image: circleci/postgres:9.4

    working_directory: ~/repo

    steps:
      - checkout

      # Download and cache dependencies
      - restore_cache:
          keys:
          - v1-dependencies-{{ checksum "requirements.txt" }}
          # fallback to using the latest cache if no exact match is found
          - v1-dependencies-

      - run:
          name: install dependencies
          command: |
            mkdir -p ./venv
            python3 -m venv venv
            . venv/bin/activate
            curl -s https://packagecloud.io/install/repositories/abeja/platform-public/script.python.sh | bash
            pip3 install -r requirements.txt

      - save_cache:
          paths:
            - venv
          key: v1-dependencies-{{ checksum "requirements.txt" }}

      # run tests!
      # this example uses Django's built-in test-runner
      # other common Python testing frameworks include pytest and nose
      # https://pytest.org
      # https://nose.readthedocs.io
      - run:
          name: deploy build
          command: |
            . venv/bin/activate
            python3 manage.py

      - store_artifacts:
          path: test-reports
          destination: test-reports

workflows:
  version: 2
  build-and-deploy:
    jobs:
      - deploy:
          filters:
            tags:
              only: /v.*/
            branches:
              ignore: /.*/

기본적으로 circleci가 만든 템플릿을 유용합니다.
특기항으로서는, 배치시에 ABEJA SDK를 사용하기 위해서 다음의 커멘드를 삽입하고 있습니다.
curl -s https://packagecloud.io/install/repositories/abeja/platform-public/script.python.sh | bash

CircleCI에 환경 변수 설정



배포 중에 필요한 ABEJA Platform의 Credential 등은 CircleCI에서 환경 변수로 제공합니다.



학습 코드의 Deploy 스크립트 작성



다음으로 배포하는 코드를 작성했습니다.

manage.py
import os
import base64
import shutil
from abeja.train import APIClient

# Set dataset_id
dataset_id =
# num epochs
num_epochs =

organization_id = os.environ['ABEJA_ORGANIZATION_ID']
job_definition_name = os.environ['job_definition_id']

shutil.make_archive('source', 'zip', root_dir='scripts')
with open('source.zip', 'rb') as f:
    source_code_base64 = base64.encodestring(f.read()).decode('ascii')

params = {
    "handler": "examples.ssd.train_from_scratch:handler",
    "datasets": {
        "train": dataset_id,
    },
    "image": "abeja-inc/all-gpu:18.10",
    "source_code_base64": source_code_base64,
    "user_parameters": {}
}
api_client = APIClient()
response = api_client.create_training_job_definition_version(organization_id, job_definition_name, params)

version_id = response['job_definition_version']
user_parameters = {
    'num_epochs': num_epochs,
}
response = api_client.create_training_job(organization_id,
                                          job_definition_name,
                                          version_id,
                                          user_parameters)

리포지토리에서 공통되는 부분은 환경 변수로서 밖에서 하는 느낌으로 설계하고 있습니다.

테스트



빨리 첫 번째 버전 릴리스를 해 봅시다.
$ git tag v0.0.1
$ git push origin v0.0.1

잘하면 아래와 같이 success 합니다.


Platform Console을 보러 가면.



버전이 있습니다!



안전하게 Training Job에 배포되었습니다!

요약



GitHub와 ABEJA Platform을 함께 사용하여 태그 푸시 중에 배포 할 수있었습니다.
GitHub와 연동할 수 있으면 코드의 차이도 볼 수 있고, 커밋 메시지에서 무엇을 변경했는지 확실히 볼 수 있어 Platform이 편리하게 됩니다.

개인적으로는 ABEJA Platform을 실험 포트폴리오로서 보다 사용하기 쉽게 할 수 있으므로 좋은 것이 아닐까라고 생각하고 있습니다.
좋은 Platform 생활을!

좋은 웹페이지 즐겨찾기