Gradio 큐 시스템 — 동시 요청을 안전하게 다루기

Gradio 큐 시스템 — 동시 요청을 안전하게 다루기

데모가 인기를 끌면 여러 사람이 동시에 버튼을 눌러요. 그런데 모델 추론은 무겁고, 특히 GPU는 한 번에 몇 개밖에 못 돌려요. Gradio는 이런 상황을 위해 내장 큐 시스템을 갖고 있어요. 무거운 처리를 하는 이벤트 리스너마다 자동으로 큐가 만들어져서, 요청이 한 번에 하나씩 차례로 처리돼요. 수천 명의 동시 사용자도 감당할 수 있게 설계돼 있죠.

출처: https://www.gradio.app/guides/queuing

큐 구성하기

기본적으로 각 이벤트 리스너는 자기만의 큐를 갖고, 한 번에 하나의 요청을 처리해요. 이건 두 인자로 조절할 수 있어요.

  • concurrency_limit: 한 번에 동시에 처리할 요청 수예요. 예를 들어 5로 설정하면 최대 5개가 동시에 처리되고, 나머지는 슬롯이 빌 때까지 큐에 대기해요.
  • concurrency_id: 여러 이벤트 리스너가 큐를 공유하도록 같은 ID를 주는 옵션이에요.

예를 들어 GPU가 2개인데 여러 함수가 GPU를 쓴다면, 그 함수들에 같은 concurrency_id를 줘서 공유 큐를 만들 수 있어요.

import gradio as gr

with gr.Blocks() as demo:
    prompt = gr.Textbox()
    image = gr.Image()
    generate_btn_1 = gr.Button("Generate Image via model 1")
    generate_btn_2 = gr.Button("Generate Image via model 2")
    generate_btn_3 = gr.Button("Generate Image via model 3")
    generate_btn_1.click(image_gen_1, prompt, image, concurrency_limit=2, concurrency_id="gpu_queue")
    generate_btn_2.click(image_gen_2, prompt, image, concurrency_id="gpu_queue")
    generate_btn_3.click(image_gen_3, prompt, image, concurrency_id="gpu_queue")

세 이벤트 모두 "gpu_queue"라는 큐를 공유해요. 큐는 concurrency_limit=2라서 한 번에 최대 2개의 요청을 처리하죠.

참고할 점

  • 함수가 외부 API를 호출해서 그쪽이 알아서 속도를 관리한다면, concurrency_limit=None으로 무제한 동시성을 보장할 수 있어요.
  • 모든 큐의 기본 동시성 한도는 Blocks.queue()default_concurrency_limit 파라미터로 전역 설정할 수 있어요.

더 알아보기

큐와 함께 자주 쓰이는 기능인 스트리밍 출력·입력은 Streaming OutputsStreaming Inputs 가이드에서 다뤄요.