mkultr4 commited on
Commit
4aacdfd
·
verified ·
1 Parent(s): a44a77c

Upload 5 files

Browse files
Files changed (5) hide show
  1. Dockerfile +43 -43
  2. README.md +44 -44
  3. app.py +44 -44
  4. requirements.txt +3 -3
  5. 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}"