본문으로 건너뛰기
버전: docs v25.02

Asset 생성

Updated 2024.05.05

experimental_plan.yaml에 대한 이해가 어느정도 진행되었다면, 타이타닉 예제 solution을 설치 후 ALO main.py를 실행 시 assets 폴더로 설치되는 각 asset에 대한 이해가 필요합니다. 이러한 asset을 밑바닥부터 만드는 과정을 아래 가이드를 따라 진행해봅니다.

Topics



Asset 개발하기  

만약 예를들어 input & train step 두 개의 step만 연결하여 하나의 train pipeline을 구성하고자 한다면, 아래와 같이 assets 폴더 하위에 input, train 폴더를 생성하고 asset_input.py, asset_train.py 파일을 각각 생성합니다. 또한 input, train 폴더 각각에 해당 step에서 필요한 종속 패키지 리스트를 기재한 requirements.txt를 생성해줍니다.

./{solution_name}/assets/
└ input/asset_input.py
/requirements.txt
└ train/asset_train.py
/requirements.txt

이후 asset_input.py에는 아래 템플릿을 복사하여 넣고, run 함수 부분에 data를 읽어들이는 코드를 작성합니다. 타이타닉 예제에서도 확인할 수 있듯이 input step은 ML Pipeline 상에서 최초로 데이터를 읽어들이는 step이므로 self.asset.load_data() API를 호출하지 않습니다.
대신, self.asset.get_input_path() API를 호출하여 얻을 수 있는 ALO가 제공하는 경로로부터 데이터 파일을 읽어들입니다. 참고로 run 함수를 작성할 때 필요한 ALO의 API들은 Appendix : What is ALO API 페이지를 참고합니다.
Warning: self.asset.get_input_path()로 얻은 경로의 마지막 폴더 명은 솔루션 개발 환경과, 실제 운영 환경에서 달라질 수 있으니, 폴더 명을 하드코딩하지 말고, self.asset.get_input_path()로 부터 얻은 경로를 os.listdir() 등으로 순회하며 파일을 읽도록 개발합니다.

#asset_[step_name].py

# -*- coding: utf-8 -*-
import os
import sys
from alolib.asset import Asset

sys.path.append(os.path.dirname(os.path.abspath(__file__)))

#--------------------------------------------------------------------------------------------------------------------------
# CLASS
#--------------------------------------------------------------------------------------------------------------------------
class UserAsset(Asset):
def __init__(self, asset_structure):
super().__init__(asset_structure)
## experimental_plan.yaml 에서 작성한 이번 Asset의 user_parameters를 dict로 load
self.args = self.asset.load_args()
## 이전 step의 Asset으로부터 넘겨 받은 config 정보를 이번 Asset에서 dict로 load
self.config = self.asset.load_config()

@Asset.decorator_run
def run(self):
## input data를 읽어들일 경로 가져오기
input_path = self.asset.get_input_path()
##### input_path로 부터 data 읽는 코드 추가 ####
## Your Code ##
################################################

## 다음 Asset으로 data, config 전달하기
## 아래 예시는 읽어들인 data를 다음 asset에 전달하고, config는 변경없이 그대로 전달
output_config = self.config

self.asset.save_data(output_data)
self.asset.save_config(output_config)

#--------------------------------------------------------------------------------------------------------------------------
# MAIN
#--------------------------------------------------------------------------------------------------------------------------
if __name__ == "__main__":
ua = UserAsset(envs={}, argv={}, data={}, config={})
ua.run()


또한 ML Pipeline 상에서 최초로 오는 Asset이 아닌 그 이후 step으로오는 Asset들을 개발할 때는 (가령 asset_train.py) 아래 템플릿을 복사하여 넣고, run 함수 부분에 self.asset.load_data()를 통해 load 된 데이터를 기반으로 Asset의 목적에 맞는 개발을 진행합니다.

#asset_[step_name].py

# -*- coding: utf-8 -*-
import os
import sys
from alolib.asset import Asset

sys.path.append(os.path.dirname(os.path.abspath(__file__)))

#--------------------------------------------------------------------------------------------------------------------------
# CLASS
#--------------------------------------------------------------------------------------------------------------------------
class UserAsset(Asset):
def __init__(self, asset_structure):
super().__init__(asset_structure)
## experimental_plan.yaml 에서 작성한 이번 Asset의 user_parameters를 dict로 load
self.args = self.asset.load_args()
## 이전 step의 Asset으로부터 넘겨 받은 config 정보를 이번 Asset에서 dict로 load
self.config = self.asset.load_config()
## 이전 step의 Asset으로부터 넘겨 받은 data 정보를 이번 Asset에서 dict로 load
self.data = self.asset.load_data()

@Asset.decorator_run
def run(self):
##### load한 self.data 를 기반으로 AI 모델을 학습하는 코드 추가 ####
## Your Code ##
##############################################################

self.asset.save_data(output_data)
self.asset.save_config(output_config)

#--------------------------------------------------------------------------------------------------------------------------
# MAIN
#--------------------------------------------------------------------------------------------------------------------------
if __name__ == "__main__":
ua = UserAsset(envs={}, argv={}, data={}, config={})
ua.run()

input, train 등의 Asset 코드 개발이 완료되었으면 동일한 과정으로 inference pipeline도 개발 진행합니다. 참고로 input asset 같은 경우 train pipeline과 inference pipeline에서 동일한 데이터 포맷을 읽어들이는 컨텐츠의 경우 동일한 asset을 공유할 수도 있습니다.
이후 solution/experimental_plan.yaml의 user_paramters와 asset_source 부분에 각 step들의 args, requirements 등을 작성하고 python main.py를 실행하여 학습, 추론에 대한 정상 동작을 확인합니다.

이후 반복적인 실험을 통해 AI Solution 사용자에게 가변 부로 노출할 experimental_plan.yaml의 args 부분을 최소화하고 코드의 확장성 등을 고려하여 최적화 및 고도화를 진행합니다.
실험까지 완료되었으면, 각각의 asset들에 대한 나만의 git repository를 생성해두고, 각 asset 폴더로 이동하여 git push를 아래와 같이 진행합니다.

cd {solution_name}/assets/{step_name}
git init
git add ./
git commit -m "Inital Commit"
git remote add origin {my_git_url}
git checkout -b v1.0.0
git push origin v1.0.0

cd ..
rm -rf {step_name}
```  
<br />
---

{solution_name}/assets/ 경로에서 rm -rf {step_name}을 실행하였기 때문에, 현재 작업 경로에서 해당 asset 폴더가 제거 되어있습니다. 이런 식으로 모든 asset들을 각각 git push 진행하고 나면,
solution/experimental_plan.yaml에서 asset_source 부분의 source/code 부분을 local에서 git주소로 변경하고, git branch 명을 작성합니다.

```yaml
#experimental_plan.yaml

asset_source:
...
- inference_pipeline:
...
- step: output
source:
code: {my_git_url}
branch: v1.0.0
requirements:
- requirements.txt


마지막으로 미리 나만의 AI Solution의 git repository를 미리 만들어두고, experimental_plan.yaml이 존재하는 {solution_name}/solution/ 경로로 이동하여 Asset을 git push했을 때와 마찬가지로 solution 폴더의 내용물을 git push 합니다.

cd {solution_name}/solution/
git init
git add ./
git commit -m "Initial Commit"
git remote add origin [my_solution_git_url]
git checkout -b v1.0.0
git push origin v1.0.0


여기까지 완료되면, AI Solution 사용자는 추후 ALO main.py와 같은 경로에서 해당 AI Solution git을 아래와 같이 설치하고 python main.py만 실행하면 곧 바로 활용이 가능해집니다.

git clone -b {my_branch} {my_git_url} solution