Spaces:
Paused
Paused
lanny xu
commited on
Commit
·
dad583a
1
Parent(s):
6f931c4
optimize query speed
Browse files- Dockerfile +58 -0
- README_DEPLOY.md +44 -0
- run_debug.py +2 -1
Dockerfile
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# 使用 Python 3.11 作为基础镜像
|
| 2 |
+
FROM python:3.11-slim
|
| 3 |
+
|
| 4 |
+
# 设置工作目录
|
| 5 |
+
WORKDIR /app
|
| 6 |
+
|
| 7 |
+
# 安装系统依赖
|
| 8 |
+
# curl: 下载 Ollama
|
| 9 |
+
# build-essential: 编译某些 Python 库可能需要
|
| 10 |
+
RUN apt-get update && apt-get install -y \
|
| 11 |
+
curl \
|
| 12 |
+
build-essential \
|
| 13 |
+
&& rm -rf /var/lib/apt/lists/*
|
| 14 |
+
|
| 15 |
+
# 安装 Ollama
|
| 16 |
+
RUN curl -fsSL https://ollama.com/install.sh | sh
|
| 17 |
+
|
| 18 |
+
# 复制依赖文件并安装
|
| 19 |
+
COPY requirements.txt .
|
| 20 |
+
# 稍微放宽版本限制以避免安装失败
|
| 21 |
+
RUN pip install --no-cache-dir -r requirements.txt
|
| 22 |
+
|
| 23 |
+
# 复制项目文件
|
| 24 |
+
COPY . .
|
| 25 |
+
|
| 26 |
+
# 创建启动脚本
|
| 27 |
+
# 1. 启动 Ollama 服务后台运行
|
| 28 |
+
# 2. 下载需要的模型 (这里用 tinyllama 以便快速演示,你可以改为 mistral 或 llama3)
|
| 29 |
+
# 3. 启动 FastAPI 应用 (Hugging Face Spaces 要求监听 7860 端口)
|
| 30 |
+
RUN echo '#!/bin/bash\n\
|
| 31 |
+
echo "🔴 Starting Ollama..."\n\
|
| 32 |
+
ollama serve &\n\
|
| 33 |
+
echo "⏳ Waiting for Ollama to start..."\n\
|
| 34 |
+
sleep 5\n\
|
| 35 |
+
echo "⬇️ Pulling model..."\n\
|
| 36 |
+
ollama pull tinyllama\n\
|
| 37 |
+
echo "🟢 Starting FastAPI Server..."\n\
|
| 38 |
+
uvicorn server:app --host 0.0.0.0 --port 7860\n\
|
| 39 |
+
' > start.sh && chmod +x start.sh
|
| 40 |
+
|
| 41 |
+
# 创建非 root 用户 (Hugging Face 安全要求)
|
| 42 |
+
RUN useradd -m -u 1000 user
|
| 43 |
+
# 给用户 Ollama 目录的权限
|
| 44 |
+
RUN mkdir -p /.ollama && chmod 777 /.ollama
|
| 45 |
+
RUN mkdir -p /app && chown -R user:user /app
|
| 46 |
+
|
| 47 |
+
# 切换用户
|
| 48 |
+
USER user
|
| 49 |
+
|
| 50 |
+
# 设置环境变量
|
| 51 |
+
ENV HOME=/home/user
|
| 52 |
+
ENV PATH=$HOME/.local/bin:$PATH
|
| 53 |
+
|
| 54 |
+
# 暴露端口 (Hugging Face 默认端口)
|
| 55 |
+
EXPOSE 7860
|
| 56 |
+
|
| 57 |
+
# 启动命令
|
| 58 |
+
CMD ["./start.sh"]
|
README_DEPLOY.md
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# 如何免费部署到 Hugging Face Spaces
|
| 2 |
+
|
| 3 |
+
既然 Kaggle 的网络环境太受限,最推荐的免费部署方案是 **Hugging Face Spaces**。它提供免费的容器环境,可以直接运行你的 FastAPI + React + Ollama 应用,并生成一个永久的公网 HTTPS 网址。
|
| 4 |
+
|
| 5 |
+
## 步骤 1: 准备账号
|
| 6 |
+
1. 注册 [Hugging Face](https://huggingface.co/) 账号。
|
| 7 |
+
2. 点击右上角头像 -> **New Space**。
|
| 8 |
+
3. **Space Name**: 随便填,比如 `adaptive-rag-demo`。
|
| 9 |
+
4. **License**: `MIT`。
|
| 10 |
+
5. **SDK**: 选择 **Docker** (这是关键)。
|
| 11 |
+
6. **Space Hardware**: 选择 **Free default** (2 vCPU, 16GB RAM)。
|
| 12 |
+
* *注意: 免费 CPU 跑 LLM 会比较慢,建议使用较小的模型如 `tinyllama` 或 `qwen:0.5b`,或者在代码里改用 API 调用外部模型。*
|
| 13 |
+
7. 点击 **Create Space**。
|
| 14 |
+
|
| 15 |
+
## 步骤 2: 上传代码
|
| 16 |
+
你有两种方式上传代码:
|
| 17 |
+
|
| 18 |
+
### 方法 A: 使用网页上传 (最简单)
|
| 19 |
+
1. 在你刚创建的 Space 页面,点击 **Files** 标签页。
|
| 20 |
+
2. 点击 **Add file** -> **Upload files**。
|
| 21 |
+
3. 把你本地项目文件夹里的所有文件(包括刚才生成的 `Dockerfile`, `server.py`, `requirements.txt` 等)拖进去。
|
| 22 |
+
* *注意: 不需要上传虚拟环境文件夹 `venv` 或 `__pycache__`。*
|
| 23 |
+
4. 点击 **Commit changes to main**。
|
| 24 |
+
|
| 25 |
+
### 方法 B: 使用 Git 命令
|
| 26 |
+
```bash
|
| 27 |
+
git clone https://huggingface.co/spaces/你的用户名/adaptive-rag-demo
|
| 28 |
+
cd adaptive-rag-demo
|
| 29 |
+
# 把你的代码复制进来
|
| 30 |
+
git add .
|
| 31 |
+
git commit -m "Initial commit"
|
| 32 |
+
git push
|
| 33 |
+
```
|
| 34 |
+
|
| 35 |
+
## 步骤 3: 等待构建
|
| 36 |
+
上传后,Hugging Face 会自动检测 `Dockerfile` 并开始构建:
|
| 37 |
+
1. 点击 Space 页面的 **App** 标签。
|
| 38 |
+
2. 你会看到 "Building..." 的状态。
|
| 39 |
+
3. 等待几分钟(安装依赖和下载模型需要时间)。
|
| 40 |
+
4. 当状态变为 **Running** 时,你会直接看到你的前端页面!
|
| 41 |
+
|
| 42 |
+
## 常见问题
|
| 43 |
+
* **模型下载慢/超时**: 我在 Dockerfile 里默认用了 `tinyllama`,因为它很小。如果你想用更好的模型(如 `mistral`),可以在 Dockerfile 里修改 `ollama pull mistral`,但构建时间会变长。
|
| 44 |
+
* **速度慢**: 免费的 CPU 空间推理速度有限。如果想流畅体验,建议在 Space Settings 里切换到 GPU (需要付费),或者修改代码让 LLM 部分调用 OpenAI/Groq 的 API,只在 Space 里跑 RAG 逻辑。
|
run_debug.py
CHANGED
|
@@ -50,10 +50,11 @@ def run_all_in_one():
|
|
| 50 |
subprocess.run("wget -q -O cloudflared https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64 && chmod +x cloudflared", shell=True)
|
| 51 |
|
| 52 |
print("\n🌐 启动 Cloudflare 隧道...")
|
|
|
|
| 53 |
tunnel_process = subprocess.Popen(
|
| 54 |
["./cloudflared", "tunnel", "--url", "http://localhost:8000", "--no-autoupdate"],
|
| 55 |
stdout=subprocess.PIPE,
|
| 56 |
-
stderr=subprocess.STDOUT,
|
| 57 |
text=True,
|
| 58 |
bufsize=1
|
| 59 |
)
|
|
|
|
| 50 |
subprocess.run("wget -q -O cloudflared https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64 && chmod +x cloudflared", shell=True)
|
| 51 |
|
| 52 |
print("\n🌐 启动 Cloudflare 隧道...")
|
| 53 |
+
# 注意:cloudflared 默认把日志输出到 stderr,而不是 stdout
|
| 54 |
tunnel_process = subprocess.Popen(
|
| 55 |
["./cloudflared", "tunnel", "--url", "http://localhost:8000", "--no-autoupdate"],
|
| 56 |
stdout=subprocess.PIPE,
|
| 57 |
+
stderr=subprocess.STDOUT, # 将 stderr 合并到 stdout
|
| 58 |
text=True,
|
| 59 |
bufsize=1
|
| 60 |
)
|