Photoruction工事中!

Photoructionの開発ブログです!

パッケージの管理ルールを制定してみた(第2弾)

はじめに

こんにちは!株式会社PhotoructionでAIエンジニアとしてインターンをしている渡邉圭太郎です。今回は、昨年末のアドベントカレンダーでの内容の続きで、CIルールについて執筆したいと思います。

アドベントカレンダーにおいて紹介しましたが、僕の所属するAIチームではよりAI開発やAI精度向上に力を入れるための改善点としてCI/CDの必要性が上がっていました。そこで、AI解析をパッケージ化やAPI化する際のCIルールを書きたいと思います。

構成図

今回制定したCIの構成図は次の図の通りです。また、Docker等のプロジェクト環境構築についてはアドベントカレンダーでの記事を参照してください。

f:id:photoruction_tech_blog:20220302182804p:plain

 

手順

  1. まず、cloudformationを用いてAWSのS3にリソースを作成し、テストデータを保存しておきます。
  2. 続いて、Github Actionsにおいて実行するためworkfileを作成します。workfileはプロジェクト配下の.github/workfilesディレクトリに配置します。
    ├── .github
    │   └── workflows
    │       └── **test.yml**
    ├── docker-compose.yml
    ├── Dockerfile
    ├── README.md
    ├── tests
    └── src
  3. 実行タイミングと環境変数を定義します。

    name: detection
    
    on: [ push, pull_request ]
    # ここでgithub actionsを走らせるタイミングを決められる。
    
    env:
    # 必要な環境変数を定義する
      AWS_DEFAULT_REGION: ${{ secrets.AWS_DEFAULT_REGION }}
      CLI_AWS_ACCESS_KEY_ID: ${{ secrets.CLI_AWS_ACCESS_KEY_ID }}
      CLI_AWS_SECRET_ACCESS_KEY: ${{ secrets.CLI_AWS_SECRET_ACCESS_KEY }}
    
      ACCOUNT_ID: ${{ secrets.RD_ACCOUNT_ID }}
      AWS_ROLE_ARN: arn:aws:iam::${{ secrets.RD_ACCOUNT_ID }}:role/cli-role
    
      BUCKET_NAME: detection
    
      PIP_CACHE_DIR_DETECTION: /tmp/cache/pip_detection
    
  4. パッケージ内関数テスト用のjobを記述します。

    jobs:
      function-test:
        name: パッケージ関数テスト
        runs-on: ubuntu-latest
        steps:
          - uses: actions/checkout@v2
    
          - name: Configure AWS credentials
            uses: aws-actions/configure-aws-credentials@v1
            with:
              aws-access-key-id: ${{ env.CLI_AWS_ACCESS_KEY_ID }}
              aws-secret-access-key: ${{ env.CLI_AWS_SECRET_ACCESS_KEY }}
              aws-region: ${{ env.AWS_DEFAULT_REGION }}
              role-to-assume: ${{ env.AWS_ROLE_ARN }}
              role-duration-seconds: 1200
              role-skip-session-tagging: true
    
          - name: Download ocr key file from S3
    				# 解析テストに必要なファイルをS3からダウンロード
            run: |
              aws s3 sync s3://$BUCKET_NAME/ocr_key ./ocr_key --quiet
    
          - name: Cache detection pip
            uses: actions/cache@v2
            with:
              path: ${{ env.PIP_CACHE_DIR_DETECTION }}
              key: ${{ runner.os }}-detection-python-cache-${{ hashFiles('./pyproject.toml') }}
              restore-keys: |
                ${{ runner.os }}-detection-python-cache-
    
          - name: Build the docker-compose
            run: docker-compose up -d detection
    
          - name: detection install modules
            run: |
              docker exec detection /bin/bash -c "poetry install"
              docker exec detection /bin/bash -c "chmod -R 755 /root/.cache/"
    
          - name: detection test
    				# パッケージ内関数テストの実行
            run: docker exec detection poetry run pytest tests -s
    
  5. AI解析において多様なデータによるパッケージの評価検証を行うために、jobを追記します。ここでは、実施するテストケースごとにjobを作成しています。また、これらのテスト結果には閾値を設け閾値以上のスコアが得られない場合は失敗という結果と共にCI(/CD)がストップします。

    jobs:
    	function-test:
    		...
    	caseA_test:
    		...
    	caseB_test:
    		...
    

    テストケースごとのjobの例

    caseA_test:
        needs: function-caseA
    		# パッケージ内関数テストが成功しないと実行しない仕様にする
        name: caseA_test
        runs-on: ubuntu-latest
        env:
          TEST_DATA_DIR: caseA_test
        steps:
          - uses: actions/checkout@v2
    
          - name: Configure AWS credentials
            uses: aws-actions/configure-aws-credentials@v1
            with:
              aws-access-key-id: ${{ env.CLI_AWS_ACCESS_KEY_ID }}
              aws-secret-access-key: ${{ env.CLI_AWS_SECRET_ACCESS_KEY }}
              aws-region: ${{ env.AWS_DEFAULT_REGION }}
              role-to-assume: ${{ env.AWS_ROLE_ARN }}
              role-duration-seconds: 1200
              role-skip-session-tagging: true
    
          - name: Download ocr key file from S3
    				# 解析に必要なファイル(ocr_keyファイルなど)をS3からダウンロード
            run: |
              aws s3 sync s3://$BUCKET_NAME/ocr_key ./ocr_key --quiet
    
          - name: Download test files from S3
    				# テストデータをS3からダウンロード
            run: |
              aws s3 sync s3://$BUCKET_NAME/test_sample/$TEST_DATA_DIR ./tests/dataset --quiet
    
          - name: Cache detection pip
            uses: actions/cache@v2
            with:
              path: ${{ env.PIP_CACHE_DIR_DETECTION }}
              key: ${{ runner.os }}-detection-python-cache-${{ hashFiles('./pyproject.toml') }}
              restore-keys: |
                ${{ runner.os }}-detection-python-cache-
    
          - name: Build the docker-compose
            run: docker-compose up -d detection
    
          - name: detection install modules
            run: |
              docker exec detection /bin/bash -c "poetry install"
              docker exec detection /bin/bash -c "chmod -R 755 /root/.cache/"
    
          - name: verification test
    				# 評価検証テストの実行
            run: docker exec detection poetry run python tests/verification.py -s
    
          - name: Upload result file from S3
    				# 評価検証結果をS3にアップロード
            run: |
              aws s3 cp ./tests/dataset/result s3://$BUCKET_NAME/test_sample/$TEST_DATA_DIR/result/$(TZ="Asia/Tokyo" date "+%Y-%m-%d_%H-%M-%S") --quiet
    

    おわりに

    今回、チーム内においてCI(/CD)ルールを制定したことにより開発のスピードがかなり上がったと感じました。また、改修の際のテストが以前に比べかなり早く終わり次の開発へ素早く移行することも可能となりました。

    個人的には、このような技術はさらに進化し出現するため最先端を走っていけるようなエンジニアになりたいです。ここまで読んでいただきありがとうございました。

    株式会社フォトラクションでは一緒に働く仲間を募集しています