Свой ChatGPT на бесплатном VPS — просто и быстро!

Эта статья предназначена для разработчиков с базовым знанием Python и Docker. Мы разберём, как развернуть модель с Hugging Face на бесплатном VPS-сервере и создать HTTP-сервис для работы с ней.
Эта статья предназначена для разработчиков с базовым знанием Python и Docker. Мы разберём, как развернуть модель с Hugging Face на бесплатном VPS-сервере и создать HTTP-сервис для работы с ней.

Я постараюсь объяснить данную тему доступным языком и предоставить практические примеры, чтобы вы могли легко применить полученные знания на практике. Даже если вы не планируете глубоко разбираться в тонкостях — просто следуйте инструкциям, и через 15 минут у вас будет работающий сервис.

Друзья, бесплатные VPS почти не встречаются, а те, что есть, часто не обеспечивают достаточную мощность для разворачивания нейросетей. Но хорошие новости — развернуть нейросеть на ограниченных ресурсах всё ещё возможно! В этом руководстве я покажу рабочие методы, которые позволяют запускать модели даже на скромных бесплатных серверах.

В качестве языка, на котором будет разрабатываться проект, будем использован python. Также будет использоваться FastAPI библиотека, для создания API сервиса и конечно контейнеризация через Docker для простоты развёртывания.

Что нам потребуется:

1. Аккаунт на HuggingFace

2. Ваша любимая IDE

Для начала создайте новый Space

1. Перейдите в Hugging Face Spaces.

2. Нажмите "New Space"

3. Введите название создаваемого пространства

3. Выберите Docker (обязательно!) → FastAPI не работает в Gradio-шаблонах.

4. В качестве docker template выберите Blank. Мы будем описывать свой шаблон

5. Нажмите на кнопку «Создать»

6. Склонируем созданный репозиторий с проектом

git clone https://huggingface.co/spaces/введите_имя_вашего_аккаунта/введите_имя_вашего_space

Зададим структуру проекта

Откройте склонированный репозиторий в вашей любимой IDE и задайте следующую структуру:

/your_project_root │ ├── .gitattributes ├── Dockerfile ├── README.md ├── main.py └── requirements.txt

Рис.1 Структура проекта

Опишем Dockerfile

FROM python:3.9-slim WORKDIR /app RUN apt-get update && \ apt-get install -y \--no-install-recommends git g++ make && \ apt-get clean && \ rm -rf /var/lib/apt/lists/\* COPY requirements.txt . RUN pip install \--no-cache-dir -r requirements.txt COPY main.py . ENV HF_HOME=/tmp/huggingface-cache ENV TOKENIZERS_PARALLELISM=false EXPOSE 7860 CMD ["uvicorn", "main:app", "\--host", "0.0.0.0", "\--port", "7860"]

Рис.2 Dockerfile

Dockerfile достаточно понятен, единственное, хочу заострить ваше внимание на переменных окружение

_ENV HF_HOME=/tmp/huggingface-cache:_

> Устанавливает переменную окружения HF_HOME, которая может использоваться библиотеками Hugging Face для хранения кэша моделей и токенизаторов. В данном случае кэш будет храниться во временной директории /tmp.

_ENV TOKENIZERS_PARALLELISM=false:_

> Устанавливает переменную окружения TOKENIZERS_PARALLELISM в значение false, что может помочь избежать проблем с многопоточностью при использовании токенизаторов Hugging Face.

Добавление зависимостей в проект

Для работы нашего приложения нам потребуются следующий зависимости

fastapi==0.109.0 uvicorn==0.27.0 torch==2.2.1 \--index-url https://download.pytorch.org/whl/cpu transformers==4.40.2 accelerate==0.29.3 sentencepiece==0.2.0 numpy==1.26.4 protobuf==3.20.3

Рис.3 Список зависимостей

Приступим к написанию API сервиса

В качестве модели, была выбрана TinyLlama/TinyLlama-1.1B-Chat-v1.0. Эта модель отлично укладывается в наши ограничения, и дает неплохую производительность. Однако, вы вольны выбрать любую другую модель, удовлетворяющую вашим нуждам.

from fastapi import FastAPI, HTTPException from pydantic import BaseModel from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline import torch import numpy as np # Check NumPy version assert np.__version__.startswith('1.'), f"Incompatible NumPy version: {np.__version__}" app = FastAPI() class RequestData(BaseModel): prompt: str max_tokens: int = 50 MODEL_NAME = "TinyLlama/TinyLlama-1.1B-Chat-v1.0" try: # Load the model with explicit device_map tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME) model = AutoModelForCausalLM.from_pretrained( MODEL_NAME, torch_dtype=torch.float32, device_map="auto", low_cpu_mem_usage=True ) # Create a pipeline without specifying a device generator = pipeline( "text-generation", model=model, tokenizer=tokenizer ) except Exception as e: print(f"Model loading error: {str(e)}") generator = None @app.post("/generate") async def generate_text(request: RequestData): if not generator: raise HTTPException(status_code=503, detail="Model not loaded") try: output = generator( request.prompt, max_new_tokens=min(request.max_tokens, 100), do_sample=False, num_beams=1, temperature=0.7, ) return {"response": output[0]["generated_text"]} except Exception as e: raise HTTPException(status_code=500, detail=str(e)) @app.get("/health") async def health_check(): return {"status": "ok" if generator else "unavailable"}

Рис.4 Основной код программы

В данной программе демонстрируется, как создать свой сервис, который принимает POST запросы по адресу /generate и возвращает ответ в виде json. Особое внимание я хочу уделить следущему блоку кода:

output = generator( request.prompt, max_new_tokens=min(request.max_tokens, 100), do_sample=False, num_beams=1, temperature=0.7, )

Рис.5. Список опций

Все эти параметры относятся к настройкам генерации текста в библиотеках для работы с нейросетями, такими как Hugging Face Transformers. Чтобы найти полное описание всех опций и их значений, вы можете обратиться к официальной документации библиотеки.

Теперь осталось только закомитить и запушить все сделанные изменения изменения. После того, как вы это сделали, на сервере запустится преднастроенный CI/CD. Перейдите по ссылке:

https://huggingface.co/spaces/введите_имя_вашего_аккаунта/введите_имя_вашего_spaces?logs=container

И вы можете наблюдать за процессом сборки. После его завершения, вы можете отправить ваш первый запрос:

curl -X POST "https://your_account_name-your_space_name.hf.space/generate" \ -H "Content-Type: application/json" \ -d '{"prompt":"What is weather?"}'

Рис. 6 curl запрос

Если вы все сделали правильно, то получите ответ на ваш запрос следующего содержания:

{"response":"What is Docker?\n\nDocker is a tool for creating and deploying Linux-based containers. It allows you to build and deploy applications on Linux."}

Рис.7 Ответ на запрос

Поздравляем! Вы успешно развернули свою собственную нейросеть на вашем VPS, и теперь она привязана к вашему аккаунту.

Заключение

В заключении, стоит отметить, что бесплатные Spaces на платформе Hugging Face работают на общих CPU/GPU и имеют ряд ограничений:

- Автоотключение:

Если к API не поступает запросов в течение 48 часов, Space "уснёт". Первый запрос после этого будет медленным (около 30 секунд). -

- Таймаут запросов:

Запросы, выполняющиеся дольше 1-2 минут, будут автоматически завершены.

- Отсутствие GPU:

Модели работают на CPU, что может замедлить обработку больших запросов.

- Автоудаление:

Hugging Face может удалить Space, если он неактивен более 90 дней.

Как избежать "засыпания"?

1. Регулярные запросы: Отправляйте любой запрос раз в день (можно использовать `cron` или сервисы, такие как UptimeRobot

2. Уведомления: Настройте мониторинг, чтобы получать уведомления от Hugging Face при возникновении ошибок.

Альтернативы

Если вам нужно бесплатное и простое решение → Hugging Face Spaces + FastAPI.

Если требуется 24/7 без "засыпаний" → Google Cloud Run или Fly.io. Если нужен GPU и низкая задержка → Hugging Face Inference Endpoints.

Что делать дальше?

Если нужно ограничить доступ к вашему сервису, можно добавить авторизацию. Чтобы модель работала быстрее на CPU, попробуйте применить quantization — это уменьшит её размер и ускорит обработку запросов без серьёзного падения точности. Когда проект будет готов к продакшену, разверните его с помощью Hugging Face Inference Endpoints или Google Cloud Run — эти сервисы упростят масштабирование и управление инфраструктурой.

Если вам понравилась эта статья, то вы знаете что нужно делать — подписывайтесь, ставьте лайки и делайте репосты. Это лучшая поддержка для автора. С вами был Дубовицкий Юрий, автор канала

«Ваш код еще не готов, сэр» А наш код уже готов. До связи!

Начать дискуссию