Сайты и приложения
Как выложить Gradio-приложение в интернет без Hugging Face Spaces
Коротко
Gradio-приложение можно выложить на любой хостинг, который постоянно запускает Python: нужен файл requirements.txt с gradio и запуск на адресе 0.0.0.0 вместо 127.0.0.1. Ссылка share=True для этого не подходит — она временная и ведёт через серверы Gradio. В Netrun встроенная сборка сама узнаёт Gradio и запускает его на нужном адресе и порту, поэтому обычно ничего настраивать не нужно. Видеокарт в Netrun нет, поэтому большие модели лучше вызывать по API, а на сервере держать лёгкие.
- По умолчанию Gradio слушает только адрес 127.0.0.1 и порт 7860, поэтому снаружи такое приложение недоступно.
- Адрес и порт Gradio задаются переменными окружения GRADIO_SERVER_NAME и GRADIO_SERVER_PORT, а явные аргументы launch() их перекрывают.
- Публичная ссылка от share=True ведёт через серверы Gradio и перестаёт работать через неделю.
- По умолчанию Gradio обрабатывает одно обращение к функции за раз, а остальные ждут в очереди.
- Новые Gradio-приложения в Hugging Face Spaces требуют платного плана, кроме двух приложений на ZeroGPU для бесплатных личных аккаунтов.
Gradio любят за то, что интерфейс к модели собирается в десяток строк: поле ввода, кнопка, результат. Дальше демо хочется показать заказчику, преподавателю или подписчикам, и тут выясняется, что локальный адрес 127.0.0.1:7860 никому, кроме вас, не откроется, а ссылка от share=True через неделю перестаёт работать. Привычный ответ — Hugging Face Spaces, но новые Gradio-приложения там теперь требуют платного плана, кроме ограниченного бесплатного варианта на ZeroGPU.
Хорошая новость в том, что Gradio — это обычное веб-приложение на Python, и запустить его можно на любом хостинге, который держит Python постоянно. Ниже — как подготовить проект, что делать с адресом и портом и как не упереться в память. Если вы уже выкладывали дашборд, многое будет знакомо по инструкции про Streamlit.
| Критерий | Hugging Face Spaces | Netrun | Свой сервер |
|---|---|---|---|
| Как попадает код | Через git-репозиторий Space, пересборка на каждый коммит | Архивом, папкой, из GitHub или из редактора с ИИ | Как настроите сами |
| Видеокарта | Есть платные GPU и ZeroGPU с ограничениями | Нет, только процессор | Если арендуете машину с GPU |
| Запуск Gradio | Платформа сделана под Gradio | Сборка находит Gradio и запускает его на нужном адресе и порту | Вручную: адрес, порт, автозапуск, прокси, сертификат |
| Сон без посетителей | Бесплатное оборудование засыпает примерно через 48 часов без использования | На бесплатном тарифе засыпает и просыпается при открытии, на Pro не засыпает | Не засыпает |
| Сохранность файлов | Диск Space по умолчанию не постоянный | Папка /data переживает обновление кода и перезапуски | Всё на вашем диске |
| Подходит для | Публичных демо в сообществе Hugging Face и моделей, которым нужна видеокарта | Демо на процессоре и приложений, которые вызывают модели по API | Полного контроля и собственных видеокарт |
Соберите зависимости в requirements.txt#
Положите рядом с главным файлом, обычно app.py, файл requirements.txt со списком библиотек — вместе с самим gradio. По нему хостинг поставит зависимости, а Netrun ещё и поймёт, что перед ним Gradio-приложение. Если вы используете torch, а видеокарты на сервере нет, ставьте сборку для процессора: она заметно меньше и быстрее устанавливается.
Не прописывайте адрес и порт в launch()#
Gradio берёт адрес и порт из переменных окружения GRADIO_SERVER_NAME и GRADIO_SERVER_PORT, но явные аргументы server_name и server_port в launch() их перекрывают. В Netrun встроенная сборка сама запускает Gradio на 0.0.0.0 и порту 8080, поэтому достаточно вызвать demo.launch() без аргументов. Если в коде стоит server_name="127.0.0.1" или server_port=7860, уберите их, иначе ссылка не откроется. В собственном Dockerfile задайте server_name="0.0.0.0" и порт из переменной PORT.
Уберите share=True#
Параметр share=True создаёт временную публичную ссылку через серверы Gradio, и через неделю она перестаёт работать. На хостинге он не нужен: у приложения и так есть собственный адрес с HTTPS. Кроме того, такая ссылка ведёт к приложению через чужие серверы, а не напрямую.
Оцените, сколько памяти нужно модели#
Модель обычно загружается в оперативную память целиком, и большие модели легко превышают лимит тарифа — тогда система останавливает процесс, а в логах появляется Killed. Видеокарт в Netrun нет, всё считается на процессоре, поэтому языковые модели и генерация картинок будут медленными или не поместятся вовсе. Лёгкие модели вроде классификаторов и небольших моделей для текста работают нормально, а тяжёлые лучше вызывать по API у сервиса, который их запускает.
Храните скачанные модели в постоянной папке#
Если приложение скачивает модель при старте, без постоянной папки оно будет качать её заново после каждой публикации. Укажите переменную окружения HF_HOME со значением /data/huggingface — в Netrun это делается во вкладке «Секреты». Тогда кэш библиотек Hugging Face окажется в постоянной папке /data и переживёт обновление кода. Помните, что модель занимает место на диске тарифа.
Опубликуйте и отправьте ссылку#
Загрузите проект архивом, папкой или из GitHub, ключи внешних сервисов укажите в «Секретах» и дождитесь сборки. Netrun поставит зависимости, запустит приложение и выдаст ссылку с HTTPS, а живые логи покажут ошибку загрузки модели сразу. Если много людей пользуются демо одновременно, учтите очередь Gradio: по умолчанию функция обрабатывает одно обращение за раз.
Hugging Face Spaces по-прежнему хорош для публичных демо и моделей, которым нужна видеокарта. Если же демо работает на процессоре или вызывает модели по API, его проще держать на обычном хостинге: в Netrun Gradio запускается из кода без настройки адреса и порта, ключи лежат в секретах, а модели в /data не скачиваются заново. На бесплатном тарифе приложение засыпает без посетителей и просыпается при открытии ссылки, первое открытие после паузы занимает несколько секунд. Для демо, которое показывают вживую, подойдёт Pro. Попробовать Netrun.
Частые вопросы
Почему Gradio-приложение не открывается на сервере?
Чаще всего оно слушает 127.0.0.1, как Gradio делает по умолчанию, или в launch() прописан порт 7860, а хостинг ждёт другой. Уберите server_name и server_port из launch() или задайте адрес 0.0.0.0 и порт из переменной PORT. Точная причина обычно видна в логах при запуске.
Можно ли оставить share=True вместо хостинга?
Для быстрой демонстрации на пару дней — можно, но ссылка через серверы Gradio перестаёт работать через неделю и живёт только пока запущен ваш компьютер. Для постоянного адреса нужен хостинг, где приложение работает без вас.
Потянет ли сервер без видеокарты большую модель?
Обычно нет: большие языковые модели и генерация картинок на процессоре работают очень медленно и часто не помещаются в память тарифа. Практичный вариант — держать на сервере интерфейс Gradio, а саму модель вызывать по API у сервиса, который её запускает. Лёгкие модели при этом спокойно работают на процессоре.
Почему приложение падает с ошибкой Killed?
Так система останавливает процесс, которому не хватило оперативной памяти, и чаще всего это происходит при загрузке модели. Возьмите модель поменьше, загружайте её один раз при старте, а не на каждый запрос, или перенесите тяжёлую часть на внешний API. Если памяти не хватает самому приложению, нужен тариф с большими ресурсами.
Чем Gradio отличается от Streamlit при публикации?
Оба — веб-приложения на Python, и публикуются они одинаково: файл requirements.txt, главный файл с кодом и запуск на 0.0.0.0. Gradio удобнее для интерфейса к одной модели с входом и выходом, Streamlit — для дашбордов и отчётов. В Netrun оба фреймворка распознаются автоматически.
Можно ли запустить проект на Python — Django, Flask или FastAPI?
Да. Положите зависимости в requirements.txt — Netrun определит Python и соберёт проект сам. Django, Flask и FastAPI поддерживаются; приложение должно слушать порт из переменной окружения, а ключи и доступ к базе задаются как секреты, а не в коде.
Почему мой сайт иногда засыпает?
На бесплатном тарифе сайты засыпают после простоя и просыпаются за пару секунд при первом запросе. На тарифе Pro проект работает без сна.
Где указать токены и другие секретные значения?
В проекте есть вкладка «Секреты» — там задаются значения из кода, например токен от BotFather. Мы храним их в зашифрованном виде: названия переменных вы видите, сами значения не показываем никому, включая вас.