Новости и статьи об искусственном интеллекте и нейросетях. Мы собираем и обрабатываем самую актуальную информацию из мира AI. О проекте

Статьи

Краткий гид по Gradio

Гид по Gradio объясняет, как создавать веб-интерфейсы для моделей ИИ на Python без фронтенда. От простых демо с текстом и изображениями до чат-ботов с состоянием и дашбордов на PyTorch. Разберём развертывание на Hugging Face и публикацию ссылок.

6 января 2026 г.
12 мин
154
The KDnuggets Gradio Crash Course

Знакомство с Gradio

Gradio — фреймворк на Python, который сильно упрощает создание интерактивных веб-интерфейсов для моделей машинного обучения. Достаточно нескольких строк кода, чтобы собрать аккуратное приложение: оно принимает разные входные данные вроде текста, изображений или аудио и выводит результаты понятно и удобно. Такой подход подходит исследователям, дата-сайентистам и разработчикам — теперь развертывание моделей доступно любому.

Gradio предлагает такие возможности:

  • Переход от модели к рабочему демо занимает минуты.
  • Никаких навыков фронтенда — всё на чистом Python.
  • Поддержка текста, изображений, аудио и других форматов.
  • Простое локальное тестирование, публикация и бесплатный публичный хостинг.

Установка Gradio и первый запуск

Чтобы начать, установите пакет через pip.

pip install gradio

После установки создайте файл gradio_app.py и добавьте в него код:

import gradio as gr
def greet(name):
    return f"Hello {name}!"

demo = gr.Interface(
    fn=greet,
    inputs="text",
    outputs="text",
    title="Greeting App"
)

demo.launch()

Запустите файл командой python gradio_app.py — откроется веб-приложение по адресу http://127.0.0.1:7860/. Интерфейс сам сгенерирует поле для текста, кнопку отправки и область вывода на основе вашего описания.

Gradio greetings app

Как работает gr.Interface

Класс gr.Interface — это основной инструмент Gradio, который скрывает технические детали. Ему нужны три ключевых элемента:

  • Функция (fn): обработчик входных данных на Python.
  • Входы: типы компонентов для ввода.
  • Выходы: типы компонентов для результата.

Компоненты ввода и вывода

Вместо простых строк вроде "text", "image" или "audio" лучше использовать классы компонентов для большего контроля.

import gradio as gr
demo = gr.Interface(
    fn=lambda x: x,
    inputs=gr.Textbox(lines=2, placeholder="Enter text here..."),
    outputs=gr.Textbox(label="Output")
)

Популярные компоненты:

  • gr.Textbox(): поле для многострочного текста.
  • gr.Image(): загрузка и предпросмотр изображений.
  • gr.Audio(): работа с аудиофайлами.
  • gr.Checkbox(): флажок для булевых значений.
  • gr.Slider(): ползунок для чисел в диапазоне.
  • gr.Radio(): выбор из вариантов.
  • gr.Dropdown(): выпадающий список опций.

Работа с несколькими входами и выходами

Для реальных задач часто требуется несколько полей ввода или результатов. Gradio справляется с этим через списки.

import gradio as gr
def process_form(name, is_morning, temperature):
    greeting = "Good morning" if is_morning else "Hello"
    message = f"{greeting}, {name}! Temperature: {temperature}°C"
    return message, temperature * 1.8 + 32  # Convert to Fahrenheit

demo = gr.Interface(
    fn=process_form,
    inputs=[
        gr.Textbox(label="Name"),
        gr.Checkbox(label="Is it morning?"),
        gr.Slider(0, 100, label="Temperature (°C)")
    ],
    outputs=[
        gr.Textbox(label="Greeting"),
        gr.Number(label="Temperature (°F)")
    ]
)
demo.launch()
Gradio Multiple Inputs and Outputs

Функция должна принимать столько параметров, сколько входов, и возвращать столько значений, сколько выходов.

Обработка изображений

Демонстрация моделей для изображений проходит без проблем:

import gradio as gr
import numpy as np
def apply_sepia(image):
    # Image comes as numpy array with shape (height, width, channels)
    sepia_filter = np.array([[0.393, 0.769, 0.189],
                             [0.349, 0.686, 0.168],
                             [0.272, 0.534, 0.131]])
    sepia_image = image.dot(sepia_filter.T)
    sepia_image = np.clip(sepia_image, 0, 255).astype(np.uint8)
    return sepia_image

demo = gr.Interface(
    fn=apply_sepia,
    inputs=gr.Image(label="Input Image"),
    outputs=gr.Image(label="Sepia Filtered"),
    title="Sepia Filter App"
)
demo.launch()
Gradio Working with Images

Компонент gr.Image берёт на себя загрузку файлов, предпросмотр и преобразование в массивы NumPy для обработки.

Обработка аудио

С аудио всё так же просто:

import gradio as gr
def transcribe_audio(audio):
    return "Transcribed text would appear here"
demo = gr.Interface(
    fn=transcribe_audio,
    inputs=gr.Audio(label="Upload Audio", type="filepath"),
    outputs=gr.Textbox(label="Transcription"),
    title="Speech-to-Text Demo"
)
demo.launch()
Gradio Audio Processing

В полноценном приложении внутри transcribe_audio(audio) вызывается модель распознавания речи. Здесь для примера возвращается заглушка.

Сложные интерфейсы с помощью Gradio Blocks

Если gr.Interface хорош для базовых случаев, то gr.Blocks даёт полный контроль над расположением и потоком данных. Это низкоуровневый инструмент для многошаговых приложений.

Простой пример на Blocks

import gradio as gr
def greet(name):
    return f"Hello {name}!"

with gr.Blocks() as demo:
    name_input = gr.Textbox(label="Your Name")
    greet_button = gr.Button("Greet")
    output = gr.Textbox(label="Greeting")
    greet_button.click(
        fn=greet,
        inputs=name_input,
        outputs=output
    )

demo.launch()
Gradio Basic Blocks Example

Сложная верстка с рядами и колонками

Вот продвинутый пример с интеграцией Transformers. Сначала установите пакет Transformers.

pip install transformers
import gradio as gr
from transformers import pipeline

# Load a translation model
translator = pipeline("translation_en_to_de", model="t5-small")

def translate_text(text):
    result = translator(text, max_length=40)[0]
    return result['translation_text']

with gr.Blocks(title="English to German Translator") as demo:
    gr.Markdown("# 🌍 English to German Translator")
    with gr.Row():
        with gr.Column():
            english_input = gr.Textbox(
                label="English Text",
                placeholder="Enter text to translate...",
                lines=4
            )
            translate_btn = gr.Button("Translate", variant="primary")
        with gr.Column():
            german_output = gr.Textbox(
                label="German Translation",
                lines=4
            )
    # Add example prompts
    gr.Examples(
        examples=[
            ["Hello, how are you?"],
            ["The weather is beautiful today"],
            ["Machine learning is fascinating"]
        ],
        inputs=english_input
    )
    translate_btn.click(
        fn=translate_text,
        inputs=english_input,
        outputs=german_output
    )

demo.launch()
Gradio Complex Layout with Rows and Columns

Управление состоянием в приложениях Gradio

Для интерактивных приложений важно отслеживать состояние. Gradio поддерживает глобальное состояние и состояние сессии.

Состояние сессии для каждого пользователя

Состояние сессии сохраняет данные для конкретного пользователя. Пример простого чат-бота с историей сообщений:

import gradio as gr

with gr.Blocks() as demo:
    chatbot = gr.Chatbot(label="Conversation")
    msg = gr.Textbox(label="Your Message")
    clear = gr.Button("Clear")
    state = gr.State([])

    def user_message(message, history):
        # Update history with user message and placeholder for bot
        return "", history + [[message, None]]

    def bot_response(history):
        # Simple echo bot logic
        response = f"I received: {history[-1][0]}"
        history[-1][1] = response
        return history

    msg.submit(
        user_message,
        [msg, state],
        [msg, state]
    ).then(
        bot_response,
        state,
        chatbot
    )
    clear.click(lambda: (None, []), None, [chatbot, state])

demo.launch()

Развертывание и публикация приложений

Для быстрой публикации Gradio создаёт публичную ссылку:

demo.launch(share=True)

Такая ссылка временная, доступна всем и действует обычно 72 часа — идеально для демо и обмена с коллегами.

Бесплатный постоянный хостинг через Hugging Face:

  • Зарегистрируйтесь на Hugging Face.
  • Создайте новый Space с SDK Gradio.
  • Загрузите файлы: app.py (основное приложение) и requirements.txt (зависимости). Пример содержимого requirements.txt:
torch
transformers
  • Отправьте код в Git:
git add .
git commit -m "Initial commit"
git push

Приложение будет доступно по адресу https://huggingface.co/spaces/your-username/your-space-name.

Gradio работает на любых платформах для Python-веб-приложений:

  • demo.launch(server_name="0.0.0.0", server_port=7860).
  • Упакуйте с зависимостями в Docker-контейнер.
  • Разверните на AWS, Google Cloud, Azure или других сервисах.

Дашборд для классификации изображений

Соберём всё воедино: создадим дашборд для классификации изображений на PyTorch с Gradio. Пользователи загружают фото через браузер, а модель выдаёт топ-5 предсказанных классов.

Используем ResNet-50 — свёрточную сеть, обученную на ImageNet. Модель готовая, без дообучения или своих данных. Проект подходит для экспериментов и обучения, а не для продакшена.

Gradio обеспечит лёгкий интерфейс для взаимодействия с моделью прямо в браузере.

import gradio as gr
import torch
from torchvision import models, transforms
from PIL import Image

# Load pre-trained model
model = models.resnet50(pretrained=True)
model.eval()

# Preprocessing
preprocess = transforms.Compose([
    transforms.Resize(256),
    transforms.CenterCrop(224),
    transforms.ToTensor(),
    transforms.Normalize(
        mean=[0.485, 0.456, 0.406],
        std=[0.229, 0.224, 0.225]
    )
])

def classify_image(image):
    image = Image.fromarray(image)
    input_tensor = preprocess(image)
    input_batch = input_tensor.unsqueeze(0)
    with torch.no_grad():
        output = model(input_batch)
    # Get top 5 predictions
    probabilities = torch.nn.functional.softmax(output[0], dim=0)
    top5_prob, top5_catid = torch.topk(probabilities, 5)
    results = []
    for i in range(top5_prob.size(0)):
        results.append(f"Category {top5_catid[i].item()}: {top5_prob[i].item()*100:.2f}%")
    return "\n".join(results)

demo = gr.Interface(
    fn=classify_image,
    inputs=gr.Image(label="Upload Image"),
    outputs=gr.Textbox(label="Top 5 Predictions"),
    title="Image Classifier"
)

demo.launch()

Итоги

Gradio убирает преграды между разработкой моделей и общением с пользователями. В этом гиде разобраны основы интерфейсов, компоненты для разных типов данных, продвинутые layouts на Blocks, работа с состоянием и способы публикации.

Сила Gradio в простоте и гибкости: подходит как для быстрых прототипов внутри команды, так и для публичных приложений, где модели оживают в действии.

Горячее

Загружаем популярные статьи...

Gradio: интерфейсы для ИИ-моделей за минуты