[Gradio] 간단한 모델 서빙 웹 페이지 만들기

안녕·2024년 6월 26일
0

본 페이지에서는 Gradio 튜토리얼에 대해 다루겠습니다.

Gradio 튜토리얼


Gradio는 머신러닝 모델을 웹 앱 형태로 빌드하고 배포할 수 있도록 돕는 파이썬 라이브러리 입니다.
실제로 코드 몇 줄이면 머신러닝 모델을 사용할 수 있는 웹 기반 인터페이스를 구현할 수 있습니다.

Gradio의 장점

  • 추가적인 모델 검증이 가능하다. 다양한 입력값으로 모델의 결과를 인터렉티브하게 테스트 가능
  • 데모를 구현하기 좋다
  • 구현 및 배포가 쉽다. 공개 링크를 공유하면 누구나 웹 앱에 접근 가능

추가 설명 예정

Gradio 설치

pip install gradio

이미지 추가 예정

Gradio 실행 예시


import gradio as gr

def greet(name):
		return "Hello " + name + "!!"

iface = gr.Interface(fn=greet, inputs="text", outputs="text")
iface.launch()

이미지 추가 예정

커스터마이징 가능한 컴포넌트


import gradio as gr

def greet(name):
    return "Hello " + name + "!!"

iface = gr.Interface(fn=greet, 
                    inputs=gr.inputs.Textbox(lines=2, placeholder="이름을 입력하세요."),
                    outputs="text")
iface.launch()

이미지 추가 예정

다중 입출력


import gradio as gr

def greet(name, is_morning, temperature):
    salutation = "Good morning" if is_morning else "Good evening"
    greeting = f"{salutation} {name}. It is {temperature} degrees today"
    celsius = (temperature - 32) * 5 / 9
    return greeting, round(celsius, 2)

demo = gr.Interface(
    fn=greet,
    inputs=["text", "checkbox", gr.Slider(0, 100)],
    outputs=["text", "number"],
)
demo.launch()

이미지 추가 예정

이미지 작업


Gradio는 Image, DataFrame, Video 혹은 Label과 같은 다양한 유형의 구성 요소를 지원합니다.
아래는 이미지를 이미지로 변환하는 기능을 사용하는 예시입니다.

import numpy as np
import gradio as gr

def sepia(input_img):
    sepia_filter = np.array([
        [0.393, 0.769, 0.189], 
        [0.349, 0.686, 0.168], 
        [0.272, 0.534, 0.131]
    ])
    sepia_img = input_img.dot(sepia_filter.T)
    sepia_img /= sepia_img.max()
    return sepia_img

demo = gr.Interface(sepia, gr.Image(shape=(200, 200)), "image")
demo.launch()

Image 구성 요소를 입력으로 사용할 때 함수는 Shape(너비, 높이, 3)의 Numpy Array로 입력받습니다.

이미지 추가 예정

블록 클래스


Gradio에는 인터페이스 클래스 말고도 블록이라는 클래스가 존재합니다.(더 높은 자유도로 사용 가능)

import gradio as gr

def greet(name):
    return "Hello " + name + "!"

with gr.Blocks() as demo:
    name = gr.Textbox(label="Name")
    output = gr.Textbox(label="Output Box")
    greet_btn = gr.Button("Greet")
    greet_btn.click(fn=greet, inputs=name, outputs=output)

demo.launch()
  • 블록은 with 절로만 만들어지며 이 절 안에 생성된 모든 구성 요소는 자동으로 앱에 추가
  • 구성 요소는 만들어진 순서대로 앱에 세로로 나타남
  • 위 예시에선 버튼을 생성하고 이 버튼에 클릭 이벤트 리스너를 추가했습니다. 인터페이스와 마찬가지로 click 메서드는 Python 함수, 입력 구성 요소 및 출력 구성 요소를 사용합니다.

이미지 추가 예정

더 높은 자유도


import numpy as np
import gradio as gr

def flip_text(x):
    return x[::-1]

def flip_image(x):
    return np.fliplr(x)

with gr.Blocks() as demo:
    gr.Markdown("Flip text or image files using this demo.")
    with gr.Tab("Flip Text"):
        text_input = gr.Textbox()
        text_output = gr.Textbox()
        text_button = gr.Button("Flip")
    with gr.Tab("Flip Image"):
        with gr.Row():
            image_input = gr.Image()
            image_output = gr.Image()
        image_button = gr.Button("Flip")

    with gr.Accordion("Open for More!"):
        gr.Markdown("Look at me...")

    text_button.click(flip_text, inputs=text_input, outputs=text_output)
    image_button.click(flip_image, inputs=image_input, outputs=image_output)

demo.launch()

이미지 추가 예정

Flagging


이미지 추가 예정

출력 인터페이스 아래에 "Flag" 버튼이 있습니다.

사용자가 모델을 테스트하며 에러를 발견할 때, 개발자가 해당 이슈를 검토할 수 있도록 입력에 플래그를 지정할 수 있습니다.

인터페이스 생성자의 flagging_dir 인수에 설정한 경로 안의 CSV파일에 기록됩니다.

인터페이스에 이미지 및 오디오 컴포넌트와 같은 파일 데이터가 포함된 경우, 플래그가 해당 데이터도 저장하기 위해 폴더가 생성됩니다.

이미지 추가 예정

인터페이스 공유 (Public & Private)


launch() 메서드 안에 share=True를 설정하면 공개적으로 공유가 가능합니다.

gr.Interface(classify_image, "image", "label").launch(share=True)

위처럼 설정하면 누구나 접근 가능한 공개 링크가 생성됩니다.

이 링크를 통해 상대방의 브라우저에서 모델을 시험해 볼 수 있습니다.
(서버가 켜져있어야 함.)

Colab 노트북에서 작업하는 경우 항상 공유 링크가 생성됩니다.

링크가 Gradio 링크를 통해 제공되지만 로컬 서버의 프록시일 뿐
인터페이스를 통해 전송된 데이터를 저장하지 않습니다.

share=False(기본값)를 설정하면, 특정 사용자와 포트 포워딩을 통해 공유할 수 있는 로컬 링크만 생성됩니다.

공유 링크는 72시간 후 만료됩니다.

이미지 추가 예정

인증(Authentication)


접근을 제한하기 위해 인터페이스 앞에 인증 페이지를 넣을 수 있습니다.

launch() 메서드의 auth 인자를 사용하면 허용되는 사용자 이름/암호 튜플 리스트를 전달할 수 있습니다.

또는 커스텀 인증 처리를 위해서는 사용자 이름과 암호를 인자로 사용하는 함수를 전달하고,
인증을 허용하려면 True를 반환하고 아니면 False를 반환합니다.

이미지 추가 예정

영구 호스팅(Permanent Hosting)


Gradio 프리미엄 계정을 생성할 경우

Gradio 인프라에서 호스팅해 인터페이스를 영구적으로 공개 공유할 수 있습니다.




profile
화이팅

0개의 댓글