29 Tue
TIL
[프로그래머스 AI 스쿨 1기] 4주차 DAY 2
AWS를 활용한 인공지능 모델 배포 III
API to serve ML model
Client가 HTTP 프로토콜을 통해 서버에 요청했을 경 학습 또는 예측을 할 수 있는 API를 만드는 것이 목표. 이 모델은 학습을 통해 내부 EBS에 저장되거나 외부의 사전에 학습한 모델을 버킷으로 저장하거나 깃허브 저장소에서 가져올 수도 있다.
Interface
사용자가 기계와 소프트웨어를 제어하기 위해 상호 합의된 메뉴얼
ex) 리모
API
Application Programming Interface. 사람이 기계를 제어하는 것처럼. 기계와 기계, 소프트웨어와 소프트웨어 간의 커뮤니케이션을 위한 인터페이스
ex) 휴대폰에 도착한 카톡 알림을 워치에 출력
RESTful API for ML/DL model inference
REST아키텍처를 따르는 API이며 HTTP URI를 통해 자원을 명시하고 HTTP Method를 통해 필요한 연산을 요청하고 반환하는 API를 지칭
Practical process of machine learning
검증을 통해 배포가 가능하다고 생각하면 배포. 여기서 우리가 할 부분은 Trained Model File을 불러와서 실행하는 것.
Model Serving
모델을 제작, 훈련, 평가한다. 이후 완성된 모델을 저장하고 이후에 다시 불러온다. 이 과정에서 연속성이 존재해야 한다.
Serialization & De-serialization
S : ML/DL model을 disk에 write하여 loadable 할 수 있는 형태로 변환.
D : Python등의 환경에서 model을 불러와 추론/학습.
Handler
코드의 관리측면에서 핸들러가 필요
Frameworks for serving
딥러닝 환경에서는 GPU나 분산 처리 환경을 가지고 안정적으로 제공하는 것이 중요. Tensorflow serving이나 TorchServe, TensorRT 같은 프레임워크를 사용하는 것이 일반적이다.
실습 : Serialization & De-serialization
[프로그래머스 AI 스쿨 1기] 4주차 DAY 4
django IV - Model
view 에서는 로직처리가 있었고 이 처리의 반환값이 처리에 대한 반환값이다. 이 때 http response를 사용할 수도 있지만 render를 사용할 수도 있다. 이 때 템플릿을 사용하며 템플릿은 html, css, js가 있다.
model은 aws를 관리하는 곳인데, 모델을 활용해서 템플릿 또는 뷰에 유의미한 정보를 제공한다. 또, 데이터베이스도 관리하게 된다.
데이터베이스는 데이터를 구조화 하여 저장한 시스템이다. 단순히 정보를 저장한 창고가 아닌, 정렬기능을 제공하여 쉽게 관리할 수 있게 한다. Relational DB를 많이 사용하며 이는 column과 row를 이용해 데이터를 정의한다. 데이터베이스에 접근할 수 있는 API가 SQL이다. 그러나 장고는 SQL를 이용하지 않고도 데이터베이스에 접근할 수 있는데 이것이 ORM이다. 장고에는 객체 단위로 데이터를 다루는 ORM이 내장되어있다.
models.py
from django.db import models
# Create your models here.
class Coffee(models.Model):
name = models.CharField(default="", null=False, max_length=30) # default : 기본적으로 행에 담겨있는 값
price = models.IntegerField(default=0) # null : 비어있어도 되는지의 여부 (default : False)
is_ice = models.BooleanField(default=False) # max_length : 최대 길이
'''
문자열 : CharField
숫자 : IntegerField, SmallIntegerField
논리형 : BooleanField
시간/날짜 : DateTimeField
'''
admin.py
from django.contrib import admin
from .models import Coffee
# Register your models here.
# 어떤 모델을 admin과 연동을 하면 superuse에서 이 페이지를 관리할 수 있음
admin.site.register(Coffee)

관리자 페이지로 접속하면 Coffees가 추가된 모습. 기본적으로 Groups와 Users를 관리한다. 이 때 coffees를 누르면 오류가 발생하는데 이는 아직 장고 환경에서 coffees가 생성됨을 인식하지 못했기 때문.
python manage.py makemigrations homepage
python manage.py migrate
를 실행하고 다시 coffees를 누르면 다음과 같은 화면이 성공적으로 출력된다.

name은 charfield이기 때문에 긴 텍스트 박스, price는 intergerfield up-down 기능이 내장된 텍스트 박스, is ice는 booleanfield이기 때문에 체크 박스가 생성된 것을 알 수 있다.

이 때 위와 같이 Coffee 클래스로 생성된 두 개의 인스턴스가 존재하지만 개별적인 이름을 가질 필요가 있다. 이를 위해 다음의 코드를 Coffee 클래스에 추가한다.
def __str__(self):
return self.name

위와 같이 변경된 모습.
django V - Model on Template
모델의 내용을 템플릿으로 전달하고자 하는데 이 때 항상 view를 거쳐야 한다.
coffee.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Coffee List</title>
</head>
<body>
<h1>My Coffee List</h1>
{% for coffee in coffee_list %}
<p>{{ coffee.name }} , {{ coffee.price }}</p>
{% endfor %}
</body>
</html>
urls.py
from django.contrib import admin
from django.urls import path
from homepage.views import index, coffee_view
urlpatterns = [
path('coffee/', coffee_view), # 127.0.0.1/coffee/
path('admin/', admin.site.urls), # 127.0.0.1/admin/
path('', index) # 127.0.0.1/
]
새로운 파일이 생길 때 마다 항상 장고의 구조에 맞게 추가시켜주기
views.py
def coffee_view(request):
coffee_all = Coffee.objects.all() # 커피 클래스의 모든 행을 가져오라는 뜻.
return render(request, 'coffee.html', {"coffee_list" : coffee_all})

이 과정은 다음과 같이 진행된다.
model.py
: 잘 만들어진 모델 파일
view.py
: 모델을 import를 하고 모델의 데이터를 가지고 온다. 이 때, objects.all()
을 통해 가지고 옴. 이 외에도 get()이나 filter()등을 통해 특정 조건을 만족하는 데이터를 가지고 올 수 있음. 이후에 render를 이용하여 dictionary 형태로 template에 넘겨준다.
coffee.html
: 이 정보를 넘겨 받은 템플릿은 템플릿 변수와 태그를 통해 정보를 동적으로 처리한다.
django VI - Updating Model on Template with Form
Form을 이용해서 템플릿의 모델을 수정하기
forms.py
from django import forms
from .models import Coffee # Model 호출
class CoffeeForm(forms.ModelForm): # ModelForm을 상속받는 CoffeeForm 생성
class Meta:
model = Coffee
fields = ('name', 'price', 'is_ice')
views.py
def coffee_view(request):
coffee_all = Coffee.objects.all() # 커피 클래스의 모든 행을 가져오라는 뜻.
form = CoffeeForm()
return render(request, 'coffee.html', {"coffee_list" : coffee_all, "coffee_form" : form})
마찬가지로 view 거쳐 템플릿으로 정보가 전송되어야 한다.
coffee.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Coffee List</title>
</head>
<body>
<h1>My Coffee List</h1>
{% for coffee in coffee_list %}
<p>{{ coffee.name }} , {{ coffee.price }}</p>
{% endfor %}
<form method="Post">{% csrf_token %}
{{ coffee_form.as_p }}
<button type="submit">Save</button>
</form>
</body>
</html>
form을 구성할 때는 CSRF 토큰을 꼭 넣어줘야 한다. HTML5 보안정책이다. 그렇지 않으면 아래와 같은 에러 페이지가 출력된다.

이 때 save버튼을 눌러 POST요청을 해도 아무런 변화가 없다. 이에 대한 로직 처리를 구현해야 함.
views.py
def coffee_view(request):
coffee_all = Coffee.objects.all() # 커피 클래스의 모든 행을 가져오라는 뜻.
if request.method == "POST":
form = CoffeeForm(request.POST) # 양식이 채워진 Form 생성
if form.is_valid(): # is_valid는 form 내부 값들이 유효한지 확인한다
form.save() # Form 내용을 모델에 저장
form = CoffeeForm()
return render(request, 'coffee.html', {"coffee_list" : coffee_all, "coffee_form" : form})
Last updated
Was this helpful?