배포 저장소

배포 저장소 관리

  • 배포 저장소는 배포 모델이 저장되는 공간이며, API 서비스로 배포하기 위한 분석모델을 버전별로 관리하는 저장소입니다.
  • 하나의 분석모델로 여러 API 배포가 가능하며, 마지막 버전이 아닌 이전에 저장된 버전으로도 배포가 가능합니다.
  • API 코드 관리
API 코드는 저장된 모델 버전별로 최종 수정된 코드만 저장되며, 만약 동일한 항목의 여러 버전을 배포할 경우 버전별로 코드 적용이 가능합니다.
* 버전별 코드 변경 내역은 별도로 관리하지 않습니다.

배포 저장소 목록

deployrepo001

  1. API
    • Rest API 스크립트 Editor를 보여줍니다.
  2. 배포
    • 해당 모델을 배포합니다.
  3. 삭제
  4. 새로고침

배포 저장소 > 상세 정보 관리

배포 저장소 상세페이지는 해당 배포 모델의 상세 정보를 조회하고, 업데이트 히스토리를 관리할 수 있습니다.

배포 저장소 > 상세 정보 관리 > 요약

deployrepo002

  1. 요약
  • 배포 저장소 저장 시 설정된 정보와 저장한 파일 목록을 조회합니다.
  • 워크스페이스 정보는 모델 저장시점에서의 워크스페이스 분석플랫폼과 해당 인스턴스에 설치된 패키지 정보를 저장합니다.
  • 이후 워크스페이스가 삭제되어도 저장된 소스코드의 정보는 유지됩니다.

배포 저장소 > 상세 정보 관리 > 히스토리

deployrepo003

  1. 히스토리
  • 배포 저장소에 저장된 업데이트 히스토리 목록을 조회 할 수 있으며, 특정 리비전의 배포 모델을 다운로드 또는 배포 할 수 있습니다.

모델 배포 정보 입력

프로젝트는 논리 그룹으로 구성된 워크스페이스, 저장소, 배포 리소스를 그룹화하여 관리합니다.

deployrepo004

  1. 배포
  2. 배포 정보
  • 배포명과 배포 컨테이너에 할당할 컴퓨팅 자원(CPU, GPU, Memory) 및 Replicas 구성을 지정합니다.
  • Resource Quota 항목은 생성 후 수정이 불가능합니다.
  1. RESTAPI Editor
  • R / Python 각각의 Rest API 명세 스크립트를 확인하고 편집할 수 있습니다.
  1. Rest API 샘플 템플릿 - Python
  • Editor를 열면 기본으로 제공되는 코드입니다.
  • Flask 구동과 API 호출 이력 모니터링을 위한 코드(1~10라인, 104~149라인)는 반드시 유지되어야 합니다.
  • 배포 API 알람 기능이 제공됩니다. 사용자는 custom_alarm() 함수에서 사용자가 원하는 alarm 조건과 alarm method를 직접 지정할 수 있습니다.
# Import monitoring packages
import logging, traceback
from Accuinsight.Monitoring.deploy.monitoring_deploy import AddDeployLog
# Import flask packages
from flask import Flask, make_response, request
from flask_restplus import Api, Resource
from flask_cors import CORS
  • 위 코드는 사용자가 수정하지 않는 부분입니다.
  • Flask 구동과 API 호출 모니터링을 위해 필요한 패키지를 선언합니다.
  • Custom API 작성을 위해 필요한 패키지는 이 부분 아래에 사용자가 별도로 추가하면 됩니다.
# Flask App
app = Flask(__name__)
CORS(app)
api = Api(app, version='1.0', title='Sample API', doc='/__swagger__', description='A sample API')
app.config.SWAGGER_UI_DOC_EXPANSION = 'list'
ns_conf = api.namespace('test', description='Test APIs')
parser = ns_conf.parser()
  • Flask application 변수를 선언합니다.

  • API는 외부 애플리케이션에서 접근이 가능해야 하므로, CORS를 설정해 줍니다.

  • API class 작성에 필요한 경우, app 세부 사항(API title, namespace 등)을 수정할 수 있습니다.

  • namespace는 배포 api endpoint 뒤에 붙는 sub-URL이 됩니다.

  • parser를 이용하여, API에 들어오는 입력 변수들을 정의할 수 있습니다. (request body에 텍스트 추가, file 업로드 등)

    ** pipeline의 예측 노드 앞에는 한 개의 데이터 노드만 연결할 수 있습니다. 따라서 pipeline과 연동해서 사용하려면, 입력 변수는 한 개만 정의해야 합니다.

# Custom API class
@ns_conf.route("/")
class ConferenceList(Resource):
def get(self):
"""
returns a list of conferences
"""
def post(self):
"""
Adds a new conference to the list
"""
@ns_conf.route("/<int:id>")
class Conference(Resource):
def get(self, id):
"""
Displays a conference's details
"""
def put(self, id):
"""
Edits a selected conference
"""
  • Flask API 서비스를 사용자가 직접 구현합니다.
  • http method와 parameter에 따라 함수를 구분하여 작성합니다.
  • API는 대체로 다음 내용을 포함하여 구현됩니다.
    • 라우팅 주소 (sub-URL) 설정
    • 예측하고 싶은 값을 HTTP request 파라미터로 수집하여, 모델 input 형태로 전처리
    • 모델을 로드하고, input 값을 모델에 넣어 output 생성
    • output 값 return
    pipeline 노드는 JSONArray 형태로 데이터를 주고받기 때문에, pipeline과 연동해서 사용하려면 API input과 output을 JSONArray 형태로 만들어야 합니다. pipeline 예측 노드에서 지원하는 HTTP 통신 방법은 GET/POST 두 가지입니다.
json_arr = request.get_json()
  • 사용자 정의 함수 내부에서 json을 input으로 받은 후,
return Response(json.dumps(json_arr, ensure_ascii=False, indent=2).encode('utf-8'),
content_type='application/json; charset=utf-8')
  • output 데이터도 json 형식으로 return 합니다.
# Custom alarm function
def custom_alarm():
# Custom alarm variable initialization
log_info = deploy_monitor.get_log_info()
message = list()
# Custom alarm sample
# if log_info['latest_log']['end_time'].hour >= 16: message.append("api called after 16:00")
# if log_info['latest_log']['duration'] >= 0.01: message.append("api call has long duration time")
# if log_info['latest_log']['status_code'] != 200: message.append("api call failed")
# Set notifiers
# deploy_monitor.set_slack(hook_url='')
# deploy_monitor.set_mail(address='')
# Return message
return message
  • 배포 API의 custom alarm을 정의하는 함수입니다.
  • 변수 초기화, 변수 값 return 부분은 사용자가 수정하지 않는 부분입니다.
  • message 변수를 list 형태로 초기화합니다.
  • deploy_monitor 객체의 get_log_info() 메소드를 이용하여 log_info 변수에 API 모니터링 요약 값을 저장합니다.
    • deploy_monitor 객체는 코드 하단(129라인)에서 정의됩니다.
    • log_info 변수의 값을 이용하여 alarm 로직을 작성합니다.
    • get_log_info()의 return value는 dictionary format이며, 제공되는 값은 다음과 같습니다.
변수설명
total_call전체 호출 횟수
total_success_call성공한 호출 횟수
latest_log마지막으로 호출된 API log (dictionary format)
start_time : API 호출 요청된 시간 (datetime format)
end_time : API 호출이 처리된 시간 (datetime format)
duration : API가 요청을 처리하는 데 걸린 시간 (end_time - start_time)
url : API 호출 url
request_body : API 호출 request body 내용
request_method : API 호출 HTTP Method
status_code : API 호출 HTTP status
response_data : API response
  • alarm message를 message 변수(list)로 return 해 줍니다.
  • alarm 제작 sample이 주석으로 제공됩니다.
  • message 변수는 notifier에 보낼 메시지를 string 형태로 list에 저장합니다.
    • message.append({message_content}) 코드를 이용하면, {message_content} 내용이 message 리스트에 추가됩니다.
  • web push alarm 이외에, slack이나 mail로 alarm을 받아보고 싶다면 notifier를 SDK에 추가해 줍니다.
    • 제공되는 notifier는 slack, mail 두 가지입니다.
    • deploymonitor.set{notifier} 형태의 함수가 제공됩니다.
    • 여러 개의 채널이나 메일 주소로 알람을 보내고 싶을 경우, ',' 로 구분하여 넣어줍니다.
  • slack webhook url
    • slack webhook url은 slack workspace에 incoming webhook을 추가하면 가져올 수 있습니다.
    • slack webhook url로 메시지를 받을 채널이나 DM을 지정할 수 있습니다.
# Deploy logging object
deploy_monitor = AddDeployLog()
# Request setting for logging
@app.before_request
def before(): deploy_monitor.set_request(request)
# Logging
@app.after_request
def after(response):
deploy_monitor.set_response(response)
try:
messages, notifiers = custom_alarm()
except Exception:
logging.error("Error raised on custom_alarm function\n" + traceback.format_exc())
messages, notifiers = None, None
deploy_monitor.add_log(messages, notifiers)
return response
# Error handling
@app.errorhandler(404)
def not_found(message): return make_response(message, 404)
@app.errorhandler(400)
def bad_request(message): return make_response(message, 400)
@app.errorhandler(Exception)
def internal_error(arg):
return make_response(traceback.format_exc(), 500)
# Run api (main)
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0', port=5000)
  • 위 코드는 사용자가 수정하지 않는 부분입니다.
  • 배포 API를 구동하는 코드로, 크게 아래 세 가지 기능으로 구분됩니다.
    • 배포 API logging
    • API error handling
    • Flask 애플리케이션 실행
  • AddDeployLog() 클래스로 deploy_monitor 객체를 생성하며, deploy_monitor 객체 내 메소드를 이용하여 API 로그를 기록합니다.
    • before() 함수는 API 요청 처리 전에 호출되며, set_request() 메소드로 API request 저장
    • after() 함수는 API 요청 처리 후에 호출되며, set_response() 메소드로 API response 저장
    • after() 함수에서 custom_alarm() 함수 처리와 함께 기록된 API log를 백엔드로 전송
  • flask errorhandler로 400, 404, 500 HTTP 에러를 핸들링하고 있습니다. 다른 에러 핸들링이 필요한 경우 직접 추가 가능합니다.
  • app.run() 메소드를 호출하여 flask 서비스를 시작합니다.

Note

Rest API 스크립트 Editor – R

  • R 타입의 배포 모델 REST API 명세를 작성할 수 있는 스크립트 Editor 입니다.
  • 배포 후, 작성된 스크립트 코드에 따라 Plumber 애플리케이션이 구동됩니다.
  • 최초에는 기본으로 제공되는 샘플 템플릿이 적용되며, 사용자가 이를 수정할 수 있습니다.

Rest API 스크립트 Editor – Python

  • Python 타입의 배포 모델 REST API 명세를 작성할 수 있는 스크립트 Editor 입니다.
  • 배포 후, 작성된 스크립트 코드에 따라 Flask 애플리케이션이 구동됩니다. 
  • 최초에는 기본으로 제공되는 샘플 템플릿이 적용되며, 사용자가 이를 수정할 수 있습니다.