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

Эта статья предназначена для разработчиков с базовым знанием Python и Docker. Мы разберём, как развернуть модель с Hugging Face на бесплатном VPS-сервере и создать HTTP-сервис для работы с ней. Я постараюсь объяснить данную тему доступным языком и предоставить практические примеры, чтобы вы могли легко применить полученные знания на практике. Даже если вы не планируете глубоко разбираться в тонкостях — просто следуйте инструкциям, и через 15 минут у вас будет работающий сервис.. Друзья, бесплатные VPS почти не встречаются, а те, что есть, часто не обеспечивают достаточную мощность для разворачивания нейросетей. Но хорошие новости — развернуть нейросеть на ограниченных ресурсах всё ещё возможно! В этом руководстве я покажу рабочие методы, которые позволяют запускать модели даже на скромных бесплатных серверах. В качестве языка, на котором будет разрабатываться проект, будем использован python. Также будет использоваться FastAPI библиотека, для создания API сервиса и конечно контейнеризация через Docker для простоты развёртывания. Что нам потребуется: Аккаунт на HuggingFace Ваша любимая IDE Для начала создайте новый Space Перейдите в Hugging Face Spaces. Нажмите "New Space" Введите название создаваемого пространства Выберите Docker (обязательно!) → FastAPI не работает в Gradio-шаблонах. В качестве docker template выберите Blank. Мы будем описывать свой шаблон Нажмите на кнопку «Создать» Склонируем созданный репозиторий с проектом 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 # Проверка версии NumPy assert np.__version__.startswith('1.'), f"Несовместимая версия NumPy: {np.__version__}" app = FastAPI() class RequestData(BaseModel): prompt: str max_tokens: int = 50 MODEL_NAME = "TinyLlama/TinyLlama-1.1B-Chat-v1.0" try: # Загрузка модели с явным указанием 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 ) # Создаем pipeline без указания device generator = pipeline( "text-generation", model=model, tokenizer=tokenizer ) except Exception as e: print(f"Ошибка загрузки модели: {str(e)}") generator = None @app.post("/generate") async def generate_text(request: RequestData): if not generator: raise HTTPException(status_code=503, detail="Модель не загружена") 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 "

Apr 24, 2025 - 16:48
 0
Свой ChatGPT на бесплатном VPS — просто и быстро!

Эта статья предназначена для разработчиков с базовым знанием 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. Введите название создаваемого пространства
  4. Выберите Docker (обязательно!) → FastAPI не работает в Gradio-шаблонах.
  5. В качестве docker template выберите Blank. Мы будем описывать свой шаблон
  6. Нажмите на кнопку «Создать»
  7. Склонируем созданный репозиторий с проектом
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

# Проверка версии NumPy
assert np.__version__.startswith('1.'), f"Несовместимая версия NumPy: {np.__version__}"

app = FastAPI()

class RequestData(BaseModel):
    prompt: str
    max_tokens: int = 50

MODEL_NAME = "TinyLlama/TinyLlama-1.1B-Chat-v1.0"

try:
    # Загрузка модели с явным указанием 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
    )

    # Создаем pipeline без указания device
    generator = pipeline(
        "text-generation",
        model=model,
        tokenizer=tokenizer
    )
except Exception as e:
    print(f"Ошибка загрузки модели: {str(e)}")
    generator = None

@app.post("/generate")
async def generate_text(request: RequestData):
    if not generator:
        raise HTTPException(status_code=503, detail="Модель не загружена")

    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://введите_имя_вашего_аккаунта-введите_имя_вашего_spaces .hf.space/generate"   -H "Content-Type: application/json"   -d '{"prompt":"Что такое погода?"}'

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

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

{"response":"Что такое Docker?\n\nDocker - это инструмент для создания и развертывания на основе Linux контейнеров. Он позволяет создавать и развертывать приложения на основе Linux"

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

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

Заключение

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

  • Автоотключение: Если к API не поступает запросов в течение 48 часов, Space "уснёт". Первый запрос после этого будет медленным (около 30 секунд).
  • Таймаут запросов: Запросы, выполняющиеся дольше 1-2 минут, будут автоматически завершены.
  • Отсутствие GPU: Модели работают на CPU, что может замедлить обработку больших запросов.

Дополнительные ограничения включают:

  • Спящий режим: Если к вашему Space нет обращений более 48 часов, он переходит в "спящий" режим. Первый запрос после пробуждения может занять 30-60 секунд.
  • Ограничения ресурсов:
    • CPU: 1 ядро, ~1 GB RAM.
    • GPU (бесплатно): но только для активных Space, не работающих круглосуточно.
  • Автоудаление: 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 — эти сервисы упростят масштабирование и управление инфраструктурой.

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