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

AI Contents 수정

Updated 2024.05.05

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 수정하기

특정 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 상에서 사용자가 보게 될 설명을 작성합니다.

- probability:

Optional하게 작성하는 key로서, 분류에 대한 AI Solution일 때 Inference Data가 한 개인 경우 모든 Labels (ex. 'OK', 'NG1', 'NG2') 에 대한 probability 값을 요구 합니다.

# {solution_name}/assets/output/asset_output.py
summary = {}
summary['result'] = # model.predict() # 'OK' ## Mandatory
summary['score'] = # model.predict_proba() # 0.98 ## Mandatory
summary['note'] = # Score는 모델의 추론 예측 결과에 대한 확률 값을 나타냅니다. ## Mandatory
summary['probability'] = # model.predict_proba() # {'OK': 0.65, 'NG1':0.25, 'NG2':0.1} ## Optional
self.asset.save_summary(result=summary['result'], score=summary['score'], note=summary['note'], probability=summary['probability'])


Inference Output 수정하기  

추론 결과 output 파일은 다양한 형태로, 여러 개가 나올 수 있을 것입니다. 하지만, Mellerikat의 핵심 기능인 재학습 기능을 지원하기 위해서는, output 파일 형태에 제약이 필요합니다.
Note: 추론 결과 파일은 ALO의 asset.get_output_path() API를 사용하여 table (.csv) 파일 1개 혹은 이미지 파일 (.jpg, .png, .svg) 1개 혹은 각각 1개 씩만 저장합니다.
또한 output 파일에 들어갈 데이터가 dataframe 형태라면 해당 output 파일을 추후 재학습 요청 시 다시 학습 모델의 input 데이터로 활용하고 싶다면, output 파일에는 추론 결과 뿐 아니라 원본 input 데이터까지 concatenate하여 저장해주어야 합니다.
Edge Conductor에서는 간단한 UI 클릭을 통해 inference output 데이터에 대한 상세 보기를 제공합니다. Asset 코드 상에서 output을 저장할 경로를 얻으려면 아래 API를 활용합니다.

self.asset.get_output_path()

그 외에 외부 Dashboard에 시각화 하거나 Database 등에 저장하기 위한 데이터는 self.asset.get_extra_output_path() API를 사용하여 얻은 경로에 output 파일을 저장합니다.  

self.asset.get_extra_output_path()


AI Solution 등록하기    

AI Solution 개발이 완료 되었으면 AI Solution 등록를 진행합니다.