Реализация кодирования для создания полноценного рабочего процесса LLM на собственном оборудовании с помощью Ollama, REST API и интерфейса чата Gradio

В этом руководстве мы реализуем полнофункциональную среду Ollama внутри Google Colab для воспроизведения рабочего процесса LLM на собственном оборудовании.

Установка Ollama в Google Colab

1. Устанавливаем Ollama непосредственно на виртуальную машину Colab с помощью официального установщика Linux.
2. Запускаем сервер Ollama в фоновом режиме, чтобы открыть HTTP API на `localhost:11434`.
3. Проверяем службу.
4. Загружаем лёгкие модели, такие как `qwen2.5:0.5b-instruct` или `llama3.2:1b`, которые балансируют ограничения ресурсов с удобством использования в среде только с процессором.

Взаимодействие с моделями

Для взаимодействия с этими моделями программно мы используем конечную точку `/api/chat` через модуль `requests` Python с включённым потоковым режимом, что позволяет захватывать вывод на уровне токенов постепенно.

Создание пользовательского интерфейса с помощью Gradio

Мы накладываем пользовательский интерфейс на основе Gradio поверх этого клиента, чтобы мы могли выдавать запросы, поддерживать многооборотную историю, настраивать параметры, такие как температура и размер контекста, и просматривать результаты в режиме реального времени.

Код

“`python
import os, sys, subprocess, time, json, requests, textwrap
from pathlib import Path

def sh(cmd, check=True):
“””Run a shell command, stream output.”””
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True)
for line in p.stdout:
print(line, end=””)
p.wait()
if check and p.returncode != 0:
raise RuntimeError(f”Command failed: {cmd}”)

if not Path(“/usr/local/bin/ollama”).exists() and not Path(“/usr/bin/ollama”).exists():
print(” Installing Ollama …”)
sh(“curl -fsSL https://ollama.com/install.sh | sh”)
else:
print(” Ollama already installed.”)

try:
import gradio
except Exception:
print(” Installing Gradio …”)
sh(“pip -q install gradio==4.44.0”)
“`

Запуск сервера Ollama

“`python
def start_ollama():
try:
requests.get(“http://127.0.0.1:11434/api/tags”, timeout=1)
print(” Ollama server already running.”)
return None
except Exception:
pass
print(” Starting Ollama server …”)
proc = subprocess.Popen([“ollama”, “serve”], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True)
for _ in range(60):
time.sleep(1)
try:
r = requests.get(“http://127.0.0.1:11434/api/tags”, timeout=1)
if r.ok:
print(” Ollama server is up.”)
break
except Exception:
pass
else:
raise RuntimeError(“Ollama did not start in time.”)
return proc

serverproc = startollama()
“`

Определение модели

“`python
MODEL = os.environ.get(“OLLAMA_MODEL”, “qwen2.5:0.5b-instruct”)
print(f” Using model: {MODEL}”)
try:
tags = requests.get(“http://127.0.0.1:11434/api/tags”, timeout=5).json()
have = any(m.get(“name”)==MODEL for m in tags.get(“models”, []))
except Exception:
have = False

if not have:
print(f” Pulling model {MODEL} (first time only) …”)
sh(f”ollama pull {MODEL}”)
“`

Создание клиента для потоковой передачи

“`python
OLLAMA_URL = “http://127.0.0.1:11434/api/chat”

def ollamachatstream(messages, model=MODEL, temperature=0.2, num_ctx=None):
“””Yield streaming text chunks from Ollama /api/chat.”””
payload = {
“model”: model,
“messages”: messages,
“stream”: True,
“options”: {“temperature”: float(temperature)}
}
if num_ctx:
payload[“options”][“numctx”] = int(numctx)
with requests.post(OLLAMA_URL, json=payload, stream=True) as r:
r.raiseforstatus()
for line in r.iter_lines():
if not line:
continue
data = json.loads(line.decode(“utf-8”))
if “message” in data and “content” in data[“message”]:
yield data[“message”][“content”]
if data.get(“done”):
break
“`

Запуск теста

“`python
def smoke_test():
print(“n Smoke test:”)
sys_msg = {“role”:”system”,”content”:”You are concise. Use short bullets.”}
user_msg = {“role”:”user”,”content”:”Give 3 quick tips to sleep better.”}
out = []
for chunk in ollamachatstream([sysmsg, usermsg], temperature=0.3):
print(chunk, end=””)
out.append(chunk)
print(“n Done.n”)

try:
smoke_test()
except Exception as e:
print(” Smoke test skipped:”, e)
“`

Интеграция Gradio

“`python
import gradio as gr

SYSTEM_PROMPT = “You are a helpful, crisp assistant. Prefer bullets when helpful.”

def chatfn(message, history, temperature, numctx):
msgs = [{“role”:”system”,”content”:SYSTEM_PROMPT}]
for u, a in history:
if u: msgs.append({“role”:”user”,”content”:u})
if a: msgs.append({“role”:”assistant”,”content”:a})
msgs.append({“role”:”user”,”content”: message})
acc = “”
try:
for part in ollamachatstream(msgs, model=MODEL, temperature=temperature, numctx=numctx or None):
acc += part
yield acc
except Exception as e:
yield f” Error: {e}”

with gr.Blocks(title=”Ollama Chat (Colab)”, fill_height=True) as demo:
gr.Markdown(“# Ollama Chat (Colab)nSmall local-ish LLM via Ollama + Gradio.n”)
with gr.Row():
temp = gr.Slider(0.0, 1.0, value=0.3, step=0.1, label=”Temperature”)
numctx = gr.Slider(512, 8192, value=2048, step=256, label=”Context Tokens (numctx)”)
chat = gr.Chatbot(height=460)
msg = gr.Textbox(label=”Your message”, placeholder=”Ask anything…”, lines=3)
clear = gr.Button(“Clear”)

def user_send(m, h):
m = (m or “”).strip()
if not m: return “”, h
return “”, h + [[m, None]]

def botreply(h, temperature, numctx):
u = h[-1][0]
stream = chatfn(u, h[:-1], temperature, int(numctx))
acc = “”
for partial in stream:
acc = partial
h[-1][1] = acc
yield h

msg.submit(user_send, [msg, chat], [msg, chat])
.then(botreply, [chat, temp, numctx], [chat])
clear.click(lambda: None, None, chat)

print(” Launching Gradio …”)
demo.launch(share=True)
“`

В заключение мы создаём воспроизводимый конвейер для запуска Ollama в Colab: установка, запуск сервера, управление моделями, доступ к API и интеграция пользовательского интерфейса. Система использует REST API Ollama в качестве основного уровня взаимодействия, обеспечивая как командную строку, так и потоковый доступ Python, в то время как Gradio обрабатывает сохранение сеансов и рендеринг чата.

1. Какие шаги включает в себя установка Ollama в Google Colab?

Ответ: установка Ollama в Google Colab включает в себя следующие шаги:
1. Установка Ollama непосредственно на виртуальную машину Colab с помощью официального установщика Linux.
2. Запуск сервера Ollama в фоновом режиме, чтобы открыть HTTP API на `localhost:11434`.
3. Проверка службы.
4. Загрузка лёгких моделей, таких как `qwen2.5:0.5b-instruct` или `llama3.2:1b`.

2. Как осуществляется взаимодействие с моделями в данном руководстве?

Ответ: для взаимодействия с моделями программно используется конечная точка `/api/chat` через модуль `requests` Python с включённым потоковым режимом. Это позволяет захватывать вывод на уровне токенов постепенно.

3. Какие компоненты используются для создания пользовательского интерфейса в этом руководстве?

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

4. Какие функции выполняет код, представленный в разделе «Код»?

Ответ: код в разделе «Код» выполняет следующие функции:
* Установка Ollama, если она ещё не установлена.
* Запуск сервера Ollama.
* Определение модели для работы.
* Создание клиента для потоковой передачи.
* Запуск теста для проверки работоспособности системы.

5. Какие параметры можно настроить при использовании Gradio для взаимодействия с моделью?

Ответ: при использовании Gradio можно настроить следующие параметры:
* Температура (temperature).
* Размер контекста (num_ctx).

Источник