배포 저장소
배포 저장소 관리
- 배포 저장소는 배포 모델이 저장되는 공간이며, API 서비스로 배포하기 위한 분석모델을 버전별로 관리하는 저장소입니다.
- 하나의 분석모델로 여러 API 배포가 가능하며, 마지막 버전이 아닌 이전에 저장된 버전으로도 배포가 가능합니다.
- API 코드 관리 API 코드는 저장된 모델 버전별로 최종 수정된 코드만 저장되며, 만약 동일한 항목의 여러 버전을 배포할 경우 버전별로 코드 적용이 가능합니다. * 버전별 코드 변경 내역은 별도로 관리하지 않습니다.
배포 저장소 목록
- API
- Rest API 스크립트 Editor를 보여줍니다.
- 배포
- 해당 모델을 배포합니다.
- 삭제
- 새로고침
배포 저장소 > 상세 정보 관리
배포 저장소 상세페이지는 해당 배포 모델의 상세 정보를 조회하고, 업데이트 히스토리를 관리할 수 있습니다.
배포 저장소 > 상세 정보 관리 > 요약
- 요약
- 배포 저장소 저장 시 설정된 정보와 저장한 파일 목록을 조회합니다.
- 워크스페이스 정보는 모델 저장시점에서의 워크스페이스 분석플랫폼과 해당 인스턴스에 설치된 패키지 정보를 저장합니다.
- 이후 워크스페이스가 삭제되어도 저장된 소스코드의 정보는 유지됩니다.
배포 저장소 > 상세 정보 관리 > 히스토리
- 히스토리
- 배포 저장소에 저장된 업데이트 히스토리 목록을 조회 할 수 있으며, 특정 리비전의 배포 모델을 다운로드 또는 배포 할 수 있습니다.
모델 배포 정보 입력
프로젝트는 논리 그룹으로 구성된 워크스페이스, 저장소, 배포 리소스를 그룹화하여 관리합니다.
- 배포
- 배포 정보
- 배포명과 배포 컨테이너에 할당할 컴퓨팅 자원(CPU, GPU, Memory) 및 Replicas 구성을 지정합니다.
- Resource Quota 항목은 생성 후 수정이 불가능합니다.
- RESTAPI Editor
- R / Python 각각의 Rest API 명세 스크립트를 확인하고 편집할 수 있습니다.
- 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
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 애플리케이션이 구동됩니다.
- 최초에는 기본으로 제공되는 샘플 템플릿이 적용되며, 사용자가 이를 수정할 수 있습니다.