AI Contents 수정
AI Contents는 데이터의 입력, 전처리, 모델링 및 데이터의 출력 단계 별로 구분된 Asset(혹은 Step)들로 구성됩니다.
이러한 Asset 들은 정의된 순서에 따라 연결되어 ML Pipeline을 형성하고, 이 Pipeline을 통해 data가 흘러가면서 Asset들이 순차적으로 실행됩니다.
experimental_plan.yaml 파일에는 데이터 소스의 경로 설정을 비롯하여 전처리 파라미터, 모델 사양 및 하이퍼 파라미터 조정, 결과 artifacts 저장 경로 및 Pipeline 동작 컨트롤 등 AI Pipeline 구성에 필요한 내용이 기술됩니다.
이 experimental_plan.yaml 파일을 통해 데이터 경로를 지정하면 ALO은 해당 경로의 데이터를 input/train(혹은 inference) 경로로 복사하여 가져와서
실험 과정에 활용하게 됩니다. 이는 데이터 소스 변경과 실험 반복이 원활하도록 하여, 다양한 실험 시나리오를 손쉽게 진행 할 수 있게 합니다.
AI Contents를 실행하였는데 원하는 성능 기준을 충족하지 못하는 경우, 사용자는 특정 Asset을 수정하거나 자체 개발한 새로운 Asset을 추가 혹은 교체 할 수 있습니다.
예를 들어, 기존의 전처리 Asset이 데이터에 맞지 않는다고 판단되면, 새로운 전처리 로직을 개발하여 새로운 Asset을 만들어 이를 교체하여 모델 성능 극대화를 할 수 있습니다.
또한 ML Pipeline의 실행 속도를 개선하고자 한다면, 비효율적인 Asset을 식별해 제거함으로써 Pipeline의 가벼움과 빠른 실행을 도모할 수 있습니다.
ALO는 이처럼 각각의 Asset들이 환경에 적합하도록 쉽게 삽입 및 삭제될 수 있도록 설계되어 있습니다. 이를 통해 데이터 과학자 및 개발자는 과제에 대한 심층적인 통찰을 얻고,
신속한 실험을 통해 AI 모델의 성능을 지속적으로 향상 시킬 수 있습니다. ALO의 유연한 구조는 다양한 과제와 환경에서의 적용을 가능하게 하며, 적절한 AI Solution의 빠른 개발 및 통합을 추진합니다.
Topics
- 기존 Asset 수정하기
- 새 Asset 추가하기
- 기존 Asset 삭제하기
- ML Pipeline 동작 컨트롤하기
- Single Pipeline 만들기 (TBD)
- Inference Summary 정보 생성하기
- Inference Output 수정하기
- AI Solution 등록하기
기존 Asset 수정하기
특정 AI Contents 혹은 AI Solution 가 사용하는 각 Asset (= step)들 중 일부를 수정하려면 최초에 ALO의 main.py를 한 번 실행하여 assets 폴더에 각 Asset 코드를 먼저 다운로드 받습니다.
각 Asset의 코드 다운로드 완료 이후에는 Asset 수정 중에 각 Asset의 git에서 Asset 코드를 다시 다운로드 받지 않도록 experimental_plan.yaml의 asset_source 부분의 해당 Asset step의 code라는 key 영역을 git 주소가 아닌 local로 변경합니다.
Note : local로 사용하는 경우는 특히, 기존에 git에 존재하지 않는 아예 새로운 Asset을 최초 개발할 때에도 사용할 수 있습니다.
Note : 혹은 새로운 Asset을 개발 하는게 아닌 기존에 git 상에 존재하는 Asset을 일부 수정하여 사용할 때는
experimental_plan.yaml의 control 부의 get_asset_source 부분을 once로 설정하면 최초 main.py 실행 이후에 재실행 할 시에는 각 Asset을 git으로부터 재다운로드 하지 않습니다.
#experimental_plan.yaml
asset_source:
...
- inference_pipeline:
...
- step: output
source:
code: local # git 주소가 아닌 local로 설정
branch: custom_output
requirements:
- requirements.txt
이후, alo/assets 폴더에서 수정하려는 Asset step의 폴더 하위의 파일 내 코드를 수정하고 main.py를 실행하여 동작을 확인합니다.
새 Asset 추가하기
Note: 참고로, step은 Asset과 동일하지만, AI pipeline 상에서 특정 asset의 실행 순서가 정해짐으로써, step이라는 명칭으로도 사용됩니다.
assets 폴더에 신규 Asset step 이름으로 폴더를 생성하고 asset_[step_name].py 파일을 생성합니다.
./{solution_name}/assets/[step_name]
└ asset_[step_name].py
└ requirements.txt
아래와 같은 Asset Template을 기반으로 asset_[step_name].py 를 생성하고 목적에 맞게 개발 합니다.
#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에 전달할 정보를 dict로 저장
## - self.config['new_key'] = 'new_value' 와 같은 형태를 통해 다음 Asset으로 정보 전달 가능
## 이전 step의 Asset에서 전달해준 데이터 load하기
self.input_data = self.asset.load_data()
## (참고: 이전 Asset에서 넘겨받은 config 및 data 내의 key를 지우면 ALO 에러가 발생하게 됩니다.)
@Asset.decorator_run
def run(self):
## 다음 Asset으로 data, config 전달하기
## 아래 예시는 이전 Asset으로부터 전달 받은 data, config를 그대로 다음 Asset에 전달
output_data = self.input_data
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()
experimental_plan.yaml의 user_parameters 및 asset_source 부에 개발 완료한 Asset을 추가하여 ML pipeline을 구성을 변경합니다.
#experimental_plan.yaml
user_parameters:
...
- train_pipeline:
...
- step: {step_name}
args:
- handling_missing: dropna
asset_source:
...
- train_pipeline:
...
- step: {step_name}
source:
code: local
branch:
requirements:
- requirements.txt
기존 Asset 삭제하기
ML pipeline 상에서 특정 Asset의 실행이 불필요한 경우 experimental_plan.yaml 에서 주석 처리 하거나 삭제 할 수 있습니다.
Note : user_parameters와 asset_source에서 해당 Asset을 둘 다 삭제 혹은 주석처리 해야 에러가 발생하지 않습니다.
#experimental_plan.yaml
user_parameters:
...
- train_pipeline:
...
# - step: preprocess
# args:
# - mode: auto # auto, custom
# custom: {}
asset_source:
...
- train_pipeline:
...
# - step: preprocess
# source: ## git / local 지원
# code: {preprocess Asset git 주소}
# branch: prep_v1.0.0
# requirements:
# - requirements.txt
ML Pipeline 동작 컨트롤하기
#experimental.yaml
control:
## 1. 패키지 설치 및 asset 존재 여부를 실험 시마다 체크할지, 한번만 할지 결정 / requirements.txt 및 종속 패키지들 한번만 설치할 지 매번 설치할지도 결정
- get_asset_source: once ## once, every
## 2. 생성된 artifacts 를 backup 할 지를 결정 True / False
- backup_artifacts: True
## 3. pipeline 로그를 backup 할 지를 결정 True / False
- backup_log: True
## 4. 저장 공간 사이즈를 결정 (단위 MB)
- backup_size: 1000
## 5. Asset 사이 데이터 전달 방법으로 memory, file 를 지원
- interface_mode: file
## 6. 실행 중 memory, cpu 등의 리소스 체크를 할 지 결정 True / False
- check_resource: False
## 7. inference artifacts를 외부 경로로 전달할 때 압축 포맷을 zip으로 할지 tar.gz으로 할 지 결정 tar.gz / zip
- save_inference_format: tar.gz
-get_asset_source: # once / every
이미 존재하는 AI Contents나 AI Solution을 solution 폴더에 설치하고 python main.py를 최초 실행하면 ALO는 assets라는 폴더를 생성하고 그 하위에 각종 Asset 폴더들을 생성한 후 각 Asset의 git으로부터 소스코드를 다운로드 받습니다.
매번 python main.py를 실행할 때 마다 Asset들을 새로 다운로드 받는다면 만약 사용자가 일부 Asset코드들을 수정하였을 시 해당 코드가 날아갈 것 입니다.
따라서 experimental_plan.yaml의 control 부의 get_asset_source를 once로 설정하게 되면 최초 실행 시 1회만 Asset 코드들을 다운로드 받고, 이후 실행부터는 가령 assets 폴더 밑에 이미 input이라는 Asset 폴더가 존재하면, input Asset의 git으로부터 재차 코드를 다운로드 받지 않고 skip하게 됩니다. 만약 every로 설정하면, 실행 시 마다 Asset 코드들을 다운로드 받습니다.
- backup_artifacts: # True / False
python main.py를 실행하고 나면 train_artifacts 혹은 inference_artifacts 와 같은 결과물 폴더가 생성됩니다. backup_artifacts가 True로 돼있다면 ALO는 history 폴더로 artifacts 폴더들을 복사하여 history backup을 진행합니다.
- backup_log (TBD): # True / False
train_artifacts 혹은 inference_artifacts 하위를 보면 log 폴더가 존재하고 그 하위에는 pipeline.log 와 process.log 파일이 존재합니다. 이 중 Asset 개발자가 ALO의 logging API를 사용하여 저장한 log들은 pipeline.log에 저장됩니다. backup_log를 True로 하면 해당 파일들을 정상적으로 저장하게 됩니다.
- backup_size: # 1000 (int)
사용자의 실험 환경의 컴퓨팅 리소스에 따라 용량이 부족할 수 있기 때문에 history backup을 무한정 진행하는 것은 문제를 야기할 수 있 습니다. 따라서 backup_size를 1000으로 설정하면 1000MB 까지만 history backup을 진행합니다.
- interface_mode: # memory / file
Asset 개발자들은 asset.save_data(), asset.save_config() 와 같은 API를 활용하여 다음 Asset으로 data 및 config 정보를 넘겨주게 됩니다.
interface_mode를 memory로 설정하게 되면 data 및 config는 별도 파일로 저장되지 않고 메모리 상에서 그대로 Asset 들 간에 흘러가게 되며, interface_mode를 file로 설정하게 되면 interface 폴더에 각 Asset step의 data와 config 가 파일로 저장되고, 다음 Asset에서는 해당 파일을 읽어서 load하는 방식으로 흘러가게 됩니다.
- check_resource: # True / False
각 Asset의 실행 중의 메모리 및 cpu 리소스 상태를 log에 남길 지 말 지를 결정한다. 단, True로 설정하면 리소스 접근 시간으로 인해 프로그램 속도가 느려질 수 있다.
- save_inference_format: # zip / tar.gz
외부 경로에 저장되는 inference artifacts의 압축 파일 포맷을 zip으로 할지 tar.gz으로 할 지 결정한다.
Inference Summary 정보 생성하기
AI Solution 개발은 AI Contents 를 운영 과제에 맞도록 수정하는 과정입니다. 이 때,알고리즘은 그대로 유지하면서 Data In & Out 형태 변경 추가 및 파라미터 최적화를 진행 가능합니다.
한편 AI Solution 개발의 핵심 사항은 추론 결과를 나의 과제에 맞게 수정하는 것입니다. 이를 위해 ALO는 추론 결과를 평가하고 요약하는 API인 self.asset.save_summary()를 제공합니다. 이 API를 통해 생성된 결과 요약은 Edge Conductor의 사용자 인터페이스(UI)에서 확인하고 검토할 수 있으며, 이를 바탕으로 모델의 추론 성능을 평가할 수 있습니다.
만약 기존 AI Contents에 포함된 추론 결과의 형식이나 내용이 프로젝트의 요구 사항과 다를 경우, 사용자는 asset.load_summary() 함수를 사용하여 기존의 추론 결과를 불러온 후 필요한 조정을 진행하고 다시 저장할 수 있습니다.
이를 통해 추론 결과를 사용자 정의 형식으로 맞춤화 할 수 있어, 더 심층적이거나 상세한 정보를 제공하거나 특정 운영 환경에 더 잘 맞는 형식으로 결과물을 조정할 수 있습니다. 상세한 내용은 ALO API에 대한 상세내용은 Appendix : What is ALO API 페이지를 참고합니다.
다양한 AI 모델의 추론 결과물은 각양각색일 것이고 여러 개 일 수도 있을 것 입니다. 하지만 해당 AI Solution 서비스를 사용하는 고객의 입장에서는, 직관적으로 인지 가능한 추론 Score 값 하나를 원할 것 입니다.
따라서 데이터 사이언티스트는 추론 결과와 추론 결과에 대한 Score 등을 담은 inference summary 정보를 만들어 주어야 합니다. ALO는 이 목적을 달성하기 위해 self.asset.save_summary()라는 API를 제공하게 됩니다.
추후 Edge Conductor에서는 Edge App 내의 ALO에서 수행하는 Inference 에 대한 Summary 정보가 담긴 파일을 전달 받게 됩니다. Edge Conductor UI에서 summary를 클릭하면 해당 정보를 보여주게 됩니다.
- result:
Inference 수행의 결과를 나타냅니다. 영소문자 기준 최대 32자 까지 가능합니다.
- score:
재학습(Re-train) 여부를 판단하는 기준으로 활용할 수 있으며, 소수 둘 째 자리까지 표시됩니다. python 기본 float형으로 작성합니다. 가령 분류 문제인 경우 예측된 결과의 probability 값을 활용합니다.
- note:
AI Solution에서 Inference에 대해 참고할 사항 입니다. 영소문자 기준 최대 128자까지 가능합니다. 가령 score가 의미하는 바에 대한 설명 등 Edge Conductor UI 상에서 사용자가 보게 될 설명을 작성합니다.