Upload 5 files
Browse files- Dockerfile +43 -43
- README.md +44 -44
- app.py +44 -44
- requirements.txt +3 -3
- start.sh +34 -34
Dockerfile
CHANGED
|
@@ -1,44 +1,44 @@
|
|
| 1 |
-
FROM nvidia/cuda:12.4.1-cudnn-devel-ubuntu22.04
|
| 2 |
-
|
| 3 |
-
ENV DEBIAN_FRONTEND=noninteractive
|
| 4 |
-
ENV PYTHONUNBUFFERED=1
|
| 5 |
-
ENV PORT=7860
|
| 6 |
-
ENV LLAMA_PORT=8000
|
| 7 |
-
ENV CMAKE_BUILD_PARALLEL_LEVEL=2
|
| 8 |
-
|
| 9 |
-
RUN apt-get update && apt-get install -y \
|
| 10 |
-
git \
|
| 11 |
-
build-essential \
|
| 12 |
-
cmake \
|
| 13 |
-
curl \
|
| 14 |
-
python3 \
|
| 15 |
-
python3-pip \
|
| 16 |
-
ca-certificates \
|
| 17 |
-
&& rm -rf /var/lib/apt/lists/*
|
| 18 |
-
|
| 19 |
-
WORKDIR /app
|
| 20 |
-
|
| 21 |
-
RUN git clone --depth 1 https://github.com/ggml-org/llama.cpp /app/llama.cpp && \
|
| 22 |
-
cmake -S /app/llama.cpp -B /app/llama.cpp/build \
|
| 23 |
-
-DCMAKE_BUILD_TYPE=Release \
|
| 24 |
-
-DGGML_CUDA=ON \
|
| 25 |
-
-DLLAMA_BUILD_COMMON=ON \
|
| 26 |
-
-DLLAMA_BUILD_TOOLS=ON \
|
| 27 |
-
-DLLAMA_BUILD_SERVER=ON \
|
| 28 |
-
-DLLAMA_BUILD_EXAMPLES=OFF \
|
| 29 |
-
-DLLAMA_BUILD_TESTS=OFF \
|
| 30 |
-
-DLLAMA_BUILD_WEBUI=OFF \
|
| 31 |
-
-DBUILD_SHARED_LIBS=OFF && \
|
| 32 |
-
cmake --build /app/llama.cpp/build --config Release --target llama-server -j2
|
| 33 |
-
|
| 34 |
-
COPY requirements.txt /app/requirements.txt
|
| 35 |
-
RUN pip3 install --no-cache-dir -r /app/requirements.txt
|
| 36 |
-
|
| 37 |
-
COPY app.py /app/app.py
|
| 38 |
-
COPY start.sh /app/start.sh
|
| 39 |
-
|
| 40 |
-
RUN chmod +x /app/start.sh
|
| 41 |
-
|
| 42 |
-
EXPOSE 7860
|
| 43 |
-
|
| 44 |
CMD ["/app/start.sh"]
|
|
|
|
| 1 |
+
FROM nvidia/cuda:12.4.1-cudnn-devel-ubuntu22.04
|
| 2 |
+
|
| 3 |
+
ENV DEBIAN_FRONTEND=noninteractive
|
| 4 |
+
ENV PYTHONUNBUFFERED=1
|
| 5 |
+
ENV PORT=7860
|
| 6 |
+
ENV LLAMA_PORT=8000
|
| 7 |
+
ENV CMAKE_BUILD_PARALLEL_LEVEL=2
|
| 8 |
+
|
| 9 |
+
RUN apt-get update && apt-get install -y \
|
| 10 |
+
git \
|
| 11 |
+
build-essential \
|
| 12 |
+
cmake \
|
| 13 |
+
curl \
|
| 14 |
+
python3 \
|
| 15 |
+
python3-pip \
|
| 16 |
+
ca-certificates \
|
| 17 |
+
&& rm -rf /var/lib/apt/lists/*
|
| 18 |
+
|
| 19 |
+
WORKDIR /app
|
| 20 |
+
|
| 21 |
+
RUN git clone --depth 1 https://github.com/ggml-org/llama.cpp /app/llama.cpp && \
|
| 22 |
+
cmake -S /app/llama.cpp -B /app/llama.cpp/build \
|
| 23 |
+
-DCMAKE_BUILD_TYPE=Release \
|
| 24 |
+
-DGGML_CUDA=ON \
|
| 25 |
+
-DLLAMA_BUILD_COMMON=ON \
|
| 26 |
+
-DLLAMA_BUILD_TOOLS=ON \
|
| 27 |
+
-DLLAMA_BUILD_SERVER=ON \
|
| 28 |
+
-DLLAMA_BUILD_EXAMPLES=OFF \
|
| 29 |
+
-DLLAMA_BUILD_TESTS=OFF \
|
| 30 |
+
-DLLAMA_BUILD_WEBUI=OFF \
|
| 31 |
+
-DBUILD_SHARED_LIBS=OFF && \
|
| 32 |
+
cmake --build /app/llama.cpp/build --config Release --target llama-server -j2
|
| 33 |
+
|
| 34 |
+
COPY requirements.txt /app/requirements.txt
|
| 35 |
+
RUN pip3 install --no-cache-dir -r /app/requirements.txt
|
| 36 |
+
|
| 37 |
+
COPY app.py /app/app.py
|
| 38 |
+
COPY start.sh /app/start.sh
|
| 39 |
+
|
| 40 |
+
RUN sed -i 's/\r$//' /app/start.sh && chmod +x /app/start.sh
|
| 41 |
+
|
| 42 |
+
EXPOSE 7860
|
| 43 |
+
|
| 44 |
CMD ["/app/start.sh"]
|
README.md
CHANGED
|
@@ -1,45 +1,45 @@
|
|
| 1 |
-
---
|
| 2 |
-
title: Gemma 4 31B OpenAI API
|
| 3 |
-
emoji: 🤖
|
| 4 |
-
colorFrom: indigo
|
| 5 |
-
colorTo: blue
|
| 6 |
-
sdk: docker
|
| 7 |
-
app_port: 7860
|
| 8 |
-
startup_duration_timeout: 1h
|
| 9 |
-
suggested_hardware: l40sx1
|
| 10 |
-
models:
|
| 11 |
-
- llmfan46/gemma-4-31B-it-uncensored-heretic-GGUF
|
| 12 |
-
tags:
|
| 13 |
-
- gguf
|
| 14 |
-
- llama.cpp
|
| 15 |
-
- openai-compatible
|
| 16 |
-
- gemma
|
| 17 |
-
- multimodal
|
| 18 |
-
pinned: false
|
| 19 |
-
---
|
| 20 |
-
|
| 21 |
-
# Gemma 4 31B OpenAI API
|
| 22 |
-
|
| 23 |
-
OpenAI-compatible API for Gemma 4 31B GGUF running on llama.cpp in a Hugging Face Docker Space.
|
| 24 |
-
|
| 25 |
-
## Endpoints
|
| 26 |
-
|
| 27 |
-
- `/`
|
| 28 |
-
- `/health`
|
| 29 |
-
- `/v1/chat/completions`
|
| 30 |
-
|
| 31 |
-
## Environment Variables
|
| 32 |
-
|
| 33 |
-
- `MODEL_REPO=llmfan46/gemma-4-31B-it-uncensored-heretic-GGUF`
|
| 34 |
-
- `MODEL_FILE=gemma-4-31B-it-uncensored-heretic-Q8_0.gguf`
|
| 35 |
-
- `MMPROJ_FILE=gemma-4-31B-it-mmproj-BF16.gguf`
|
| 36 |
-
- `CTX_SIZE=4096`
|
| 37 |
-
- `N_GPU_LAYERS=-1`
|
| 38 |
-
|
| 39 |
-
## Notes
|
| 40 |
-
|
| 41 |
-
This Space is configured as a Docker Space and listens on port `7860`.
|
| 42 |
-
|
| 43 |
-
`startup_duration_timeout: 1h` gives the container more time to become healthy during large model startup.
|
| 44 |
-
|
| 45 |
The app is intended for an `l40sx1` hardware flavor.
|
|
|
|
| 1 |
+
---
|
| 2 |
+
title: Gemma 4 31B OpenAI API
|
| 3 |
+
emoji: 🤖
|
| 4 |
+
colorFrom: indigo
|
| 5 |
+
colorTo: blue
|
| 6 |
+
sdk: docker
|
| 7 |
+
app_port: 7860
|
| 8 |
+
startup_duration_timeout: 1h
|
| 9 |
+
suggested_hardware: l40sx1
|
| 10 |
+
models:
|
| 11 |
+
- llmfan46/gemma-4-31B-it-uncensored-heretic-GGUF
|
| 12 |
+
tags:
|
| 13 |
+
- gguf
|
| 14 |
+
- llama.cpp
|
| 15 |
+
- openai-compatible
|
| 16 |
+
- gemma
|
| 17 |
+
- multimodal
|
| 18 |
+
pinned: false
|
| 19 |
+
---
|
| 20 |
+
|
| 21 |
+
# Gemma 4 31B OpenAI API
|
| 22 |
+
|
| 23 |
+
OpenAI-compatible API for Gemma 4 31B GGUF running on llama.cpp in a Hugging Face Docker Space.
|
| 24 |
+
|
| 25 |
+
## Endpoints
|
| 26 |
+
|
| 27 |
+
- `/`
|
| 28 |
+
- `/health`
|
| 29 |
+
- `/v1/chat/completions`
|
| 30 |
+
|
| 31 |
+
## Environment Variables
|
| 32 |
+
|
| 33 |
+
- `MODEL_REPO=llmfan46/gemma-4-31B-it-uncensored-heretic-GGUF`
|
| 34 |
+
- `MODEL_FILE=gemma-4-31B-it-uncensored-heretic-Q8_0.gguf`
|
| 35 |
+
- `MMPROJ_FILE=gemma-4-31B-it-mmproj-BF16.gguf`
|
| 36 |
+
- `CTX_SIZE=4096`
|
| 37 |
+
- `N_GPU_LAYERS=-1`
|
| 38 |
+
|
| 39 |
+
## Notes
|
| 40 |
+
|
| 41 |
+
This Space is configured as a Docker Space and listens on port `7860`.
|
| 42 |
+
|
| 43 |
+
`startup_duration_timeout: 1h` gives the container more time to become healthy during large model startup.
|
| 44 |
+
|
| 45 |
The app is intended for an `l40sx1` hardware flavor.
|
app.py
CHANGED
|
@@ -1,45 +1,45 @@
|
|
| 1 |
-
from fastapi import FastAPI, Request, Response
|
| 2 |
-
import httpx
|
| 3 |
-
|
| 4 |
-
app = FastAPI()
|
| 5 |
-
BACKEND = "http://127.0.0.1:8000"
|
| 6 |
-
|
| 7 |
-
@app.get("/")
|
| 8 |
-
async def root():
|
| 9 |
-
return {
|
| 10 |
-
"ok": True,
|
| 11 |
-
"message": "GGUF OpenAI-compatible API is running",
|
| 12 |
-
"chat_completions": "/v1/chat/completions"
|
| 13 |
-
}
|
| 14 |
-
|
| 15 |
-
@app.get("/health")
|
| 16 |
-
async def health():
|
| 17 |
-
async with httpx.AsyncClient(timeout=10) as client:
|
| 18 |
-
r = await client.get(f"{BACKEND}/health")
|
| 19 |
-
return Response(
|
| 20 |
-
content=r.content,
|
| 21 |
-
status_code=r.status_code,
|
| 22 |
-
media_type=r.headers.get("content-type", "application/json"),
|
| 23 |
-
)
|
| 24 |
-
|
| 25 |
-
@app.api_route("/v1/{path:path}", methods=["GET", "POST", "PUT", "PATCH", "DELETE"])
|
| 26 |
-
async def proxy(path: str, request: Request):
|
| 27 |
-
url = f"{BACKEND}/v1/{path}"
|
| 28 |
-
body = await request.body()
|
| 29 |
-
headers = dict(request.headers)
|
| 30 |
-
headers.pop("host", None)
|
| 31 |
-
|
| 32 |
-
async with httpx.AsyncClient(timeout=None) as client:
|
| 33 |
-
r = await client.request(
|
| 34 |
-
method=request.method,
|
| 35 |
-
url=url,
|
| 36 |
-
headers=headers,
|
| 37 |
-
content=body,
|
| 38 |
-
params=request.query_params,
|
| 39 |
-
)
|
| 40 |
-
|
| 41 |
-
return Response(
|
| 42 |
-
content=r.content,
|
| 43 |
-
status_code=r.status_code,
|
| 44 |
-
media_type=r.headers.get("content-type", "application/json"),
|
| 45 |
)
|
|
|
|
| 1 |
+
from fastapi import FastAPI, Request, Response
|
| 2 |
+
import httpx
|
| 3 |
+
|
| 4 |
+
app = FastAPI()
|
| 5 |
+
BACKEND = "http://127.0.0.1:8000"
|
| 6 |
+
|
| 7 |
+
@app.get("/")
|
| 8 |
+
async def root():
|
| 9 |
+
return {
|
| 10 |
+
"ok": True,
|
| 11 |
+
"message": "GGUF OpenAI-compatible API is running",
|
| 12 |
+
"chat_completions": "/v1/chat/completions"
|
| 13 |
+
}
|
| 14 |
+
|
| 15 |
+
@app.get("/health")
|
| 16 |
+
async def health():
|
| 17 |
+
async with httpx.AsyncClient(timeout=10) as client:
|
| 18 |
+
r = await client.get(f"{BACKEND}/health")
|
| 19 |
+
return Response(
|
| 20 |
+
content=r.content,
|
| 21 |
+
status_code=r.status_code,
|
| 22 |
+
media_type=r.headers.get("content-type", "application/json"),
|
| 23 |
+
)
|
| 24 |
+
|
| 25 |
+
@app.api_route("/v1/{path:path}", methods=["GET", "POST", "PUT", "PATCH", "DELETE"])
|
| 26 |
+
async def proxy(path: str, request: Request):
|
| 27 |
+
url = f"{BACKEND}/v1/{path}"
|
| 28 |
+
body = await request.body()
|
| 29 |
+
headers = dict(request.headers)
|
| 30 |
+
headers.pop("host", None)
|
| 31 |
+
|
| 32 |
+
async with httpx.AsyncClient(timeout=None) as client:
|
| 33 |
+
r = await client.request(
|
| 34 |
+
method=request.method,
|
| 35 |
+
url=url,
|
| 36 |
+
headers=headers,
|
| 37 |
+
content=body,
|
| 38 |
+
params=request.query_params,
|
| 39 |
+
)
|
| 40 |
+
|
| 41 |
+
return Response(
|
| 42 |
+
content=r.content,
|
| 43 |
+
status_code=r.status_code,
|
| 44 |
+
media_type=r.headers.get("content-type", "application/json"),
|
| 45 |
)
|
requirements.txt
CHANGED
|
@@ -1,4 +1,4 @@
|
|
| 1 |
-
fastapi
|
| 2 |
-
uvicorn
|
| 3 |
-
httpx
|
| 4 |
huggingface_hub[cli]
|
|
|
|
| 1 |
+
fastapi
|
| 2 |
+
uvicorn
|
| 3 |
+
httpx
|
| 4 |
huggingface_hub[cli]
|
start.sh
CHANGED
|
@@ -1,35 +1,35 @@
|
|
| 1 |
-
#!/bin/bash
|
| 2 |
-
set -e
|
| 3 |
-
|
| 4 |
-
MODEL_REPO="${MODEL_REPO:-llmfan46/gemma-4-31B-it-uncensored-heretic-GGUF}"
|
| 5 |
-
MODEL_FILE="${MODEL_FILE:-gemma-4-31B-it-uncensored-heretic-Q8_0.gguf}"
|
| 6 |
-
MMPROJ_FILE="${MMPROJ_FILE:-gemma-4-31B-it-mmproj-BF16.gguf}"
|
| 7 |
-
CTX_SIZE="${CTX_SIZE:-4096}"
|
| 8 |
-
PORT="${PORT:-7860}"
|
| 9 |
-
LLAMA_PORT="${LLAMA_PORT:-8000}"
|
| 10 |
-
N_GPU_LAYERS="${N_GPU_LAYERS:--1}"
|
| 11 |
-
HF_HOME="${HF_HOME:-/data/huggingface}"
|
| 12 |
-
LLAMA_CACHE="${LLAMA_CACHE:-/data/llama-cache}"
|
| 13 |
-
|
| 14 |
-
mkdir -p "${HF_HOME}" "${LLAMA_CACHE}" /data/models
|
| 15 |
-
export HF_HOME
|
| 16 |
-
export LLAMA_CACHE
|
| 17 |
-
|
| 18 |
-
python3 -m pip install --no-cache-dir -U "huggingface_hub[cli]"
|
| 19 |
-
|
| 20 |
-
huggingface-cli download "${MODEL_REPO}" "${MODEL_FILE}" --local-dir /data/models
|
| 21 |
-
huggingface-cli download "${MODEL_REPO}" "${MMPROJ_FILE}" --local-dir /data/models
|
| 22 |
-
|
| 23 |
-
MODEL_PATH="/data/models/${MODEL_FILE}"
|
| 24 |
-
MMPROJ_PATH="/data/models/${MMPROJ_FILE}"
|
| 25 |
-
|
| 26 |
-
/app/llama.cpp/build/bin/llama-server \
|
| 27 |
-
-m "${MODEL_PATH}" \
|
| 28 |
-
--mmproj "${MMPROJ_PATH}" \
|
| 29 |
-
--host 0.0.0.0 \
|
| 30 |
-
--port "${LLAMA_PORT}" \
|
| 31 |
-
-c "${CTX_SIZE}" \
|
| 32 |
-
-ngl "${N_GPU_LAYERS}" \
|
| 33 |
-
&
|
| 34 |
-
|
| 35 |
exec uvicorn app:app --host 0.0.0.0 --port "${PORT}"
|
|
|
|
| 1 |
+
#!/bin/bash
|
| 2 |
+
set -e
|
| 3 |
+
|
| 4 |
+
MODEL_REPO="${MODEL_REPO:-llmfan46/gemma-4-31B-it-uncensored-heretic-GGUF}"
|
| 5 |
+
MODEL_FILE="${MODEL_FILE:-gemma-4-31B-it-uncensored-heretic-Q8_0.gguf}"
|
| 6 |
+
MMPROJ_FILE="${MMPROJ_FILE:-gemma-4-31B-it-mmproj-BF16.gguf}"
|
| 7 |
+
CTX_SIZE="${CTX_SIZE:-4096}"
|
| 8 |
+
PORT="${PORT:-7860}"
|
| 9 |
+
LLAMA_PORT="${LLAMA_PORT:-8000}"
|
| 10 |
+
N_GPU_LAYERS="${N_GPU_LAYERS:--1}"
|
| 11 |
+
HF_HOME="${HF_HOME:-/data/huggingface}"
|
| 12 |
+
LLAMA_CACHE="${LLAMA_CACHE:-/data/llama-cache}"
|
| 13 |
+
|
| 14 |
+
mkdir -p "${HF_HOME}" "${LLAMA_CACHE}" /data/models
|
| 15 |
+
export HF_HOME
|
| 16 |
+
export LLAMA_CACHE
|
| 17 |
+
|
| 18 |
+
python3 -m pip install --no-cache-dir -U "huggingface_hub[cli]"
|
| 19 |
+
|
| 20 |
+
huggingface-cli download "${MODEL_REPO}" "${MODEL_FILE}" --local-dir /data/models
|
| 21 |
+
huggingface-cli download "${MODEL_REPO}" "${MMPROJ_FILE}" --local-dir /data/models
|
| 22 |
+
|
| 23 |
+
MODEL_PATH="/data/models/${MODEL_FILE}"
|
| 24 |
+
MMPROJ_PATH="/data/models/${MMPROJ_FILE}"
|
| 25 |
+
|
| 26 |
+
/app/llama.cpp/build/bin/llama-server \
|
| 27 |
+
-m "${MODEL_PATH}" \
|
| 28 |
+
--mmproj "${MMPROJ_PATH}" \
|
| 29 |
+
--host 0.0.0.0 \
|
| 30 |
+
--port "${LLAMA_PORT}" \
|
| 31 |
+
-c "${CTX_SIZE}" \
|
| 32 |
+
-ngl "${N_GPU_LAYERS}" \
|
| 33 |
+
&
|
| 34 |
+
|
| 35 |
exec uvicorn app:app --host 0.0.0.0 --port "${PORT}"
|