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?