您的用户名 commited on
Commit
76dd601
·
1 Parent(s): 29543dc

Final attempt: Switch to robust PyTorch base image

Browse files
Files changed (3) hide show
  1. Dockerfile +16 -12
  2. main.py +10 -67
  3. requirements.txt +1 -0
Dockerfile CHANGED
@@ -1,23 +1,27 @@
1
- # 使用官方的Python 3.10镜像作为基础
2
- FROM python:3.10-slim
3
-
4
- # 在做任何事之前,先把所有编译和构建可能用到的工具一次性全部安装好
5
- RUN apt-get update && apt-get install -y build-essential cmake
6
 
7
  # 设置工作目录
8
  WORKDIR /app
9
 
10
- # --- 核心修正点在这里 ---
11
- # 在构建阶段,就提前创建好所有程序在运行时需要写入的文件夹
12
- # 并且,使用 chmod -R 777 授予它们最高权限,允许任何用户读、写、执行
13
- RUN mkdir -p /app/pip_packages /app/huggingface_cache && \
14
- chmod -R 777 /app/pip_packages /app/huggingface_cache
 
 
 
15
 
16
  # 将requirements.txt复制到工作目录中
17
  COPY requirements.txt .
18
 
19
- # 只安装那些“秒速”完成的依赖库
20
- RUN pip install --no-cache-dir -r requirements.txt
 
 
21
 
22
  # 将我们的API程序代码复制到工作目录中
23
  COPY main.py .
 
1
+ # --- 核心修正点在这里 ---
2
+ # 我们不再使用简陋的python:3.10-slim
3
+ # 而是使用一个功能强大的、预装了所有编译工具和CUDA环境的官方PyTorch镜像
4
+ FROM pytorch/pytorch:2.1.0-cuda12.1-cudnn8-runtime
 
5
 
6
  # 设置工作目录
7
  WORKDIR /app
8
 
9
+ # 这个新环境里已经包含了所有编译工具,我们不再需要自己安装
10
+ # RUN apt-get update && apt-get install -y gcc g++ build-essential cmake
11
+
12
+ # 设置环境变量,确保pip的缓存路径拥有权限
13
+ # 这是解决所有权限问题的最终方案
14
+ ENV PIP_CACHE_DIR=/app/pip_cache
15
+ ENV HF_HOME=/app/huggingface_cache
16
+ RUN mkdir -p $PIP_CACHE_DIR $HF_HOME && chmod -R 777 $PIP_CACHE_DIR $HF_HOME
17
 
18
  # 将requirements.txt复制到工作目录中
19
  COPY requirements.txt .
20
 
21
+ # --- 第二个核心修正点 ---
22
+ # 我们在安装时,明确告诉pip使用我们创建的、拥有权限的缓存目录
23
+ # 这将彻底解决所有PermissionError
24
+ RUN pip install --no-cache-dir --cache-dir $PIP_CACHE_DIR -r requirements.txt
25
 
26
  # 将我们的API程序代码复制到工作目录中
27
  COPY main.py .
main.py CHANGED
@@ -1,81 +1,36 @@
1
  import os
2
- import sys
3
- import subprocess
4
  import logging
5
  from fastapi import FastAPI
6
  from pydantic import BaseModel
7
-
8
- # ================================================================
9
- # 核心AI引擎的动态安装
10
- # ================================================================
11
- # 检查核心库是否存在,如果不存在,则在第一次运行时动态安装
12
- try:
13
- from llama_cpp import Llama
14
- logging.info("核心AI引擎 (llama-cpp-python) 已安装。")
15
- except ImportError:
16
- logging.warning("核心AI引擎 (llama-cpp-python) 未找到,正在尝试动态安装...")
17
- logging.warning("这个过程会极其缓慢 (预计15-25分钟),且只会执行一次。请耐心等待日志完成。")
18
- try:
19
- # 使用subprocess来执行pip安装命令
20
- # 我们将安装目标指定到一个拥有写入权限的本地目录
21
- install_path = "/app/pip_packages"
22
- os.makedirs(install_path, exist_ok=True)
23
- # 将这个路径添加到Python的搜索路径中
24
- sys.path.append(install_path)
25
- subprocess.check_call([
26
- sys.executable, "-m", "pip", "install",
27
- f"--target={install_path}",
28
- "llama-cpp-python"
29
- ])
30
- logging.info("核心AI引擎动态安装成功!正在重新导入...")
31
- # 重新导入
32
- from llama_cpp import Llama
33
- except Exception as e:
34
- logging.error(f"动态安装核心AI引擎失败!错误: {e}")
35
- # 如果安装失败,设置一个标志,让API返回错误
36
- Llama = None
37
-
38
  from huggingface_hub import hf_hub_download
39
 
40
- # ================================================================
41
- # 最终的main.py代码
42
- # ================================================================
43
  app = FastAPI()
44
 
45
- # --- 核心修正点在这里 ---
46
- # 我们从7B模型切换到更轻量级的4B模型,以适应16GB的内存限制
47
  MODEL_ID = "Qwen/Qwen1.5-4B-Chat-GGUF"
48
- # 同时,我们也选择这个模型对应的量化版本
49
  MODEL_FILE = "qwen1_5-4b-chat-q5_k_m.gguf"
50
 
 
51
  llm = None
52
 
 
53
  @app.on_event("startup")
54
  def load_model():
55
  global llm
56
- if Llama is None:
57
- logging.error("核心AI引擎未能加载,API将不可用。")
58
- return
59
-
60
  logging.info("正在CPU上使用 llama-cpp-python 加载GGUF模型...")
61
  logging.info(f"目标模型: {MODEL_ID}/{MODEL_FILE}")
62
  try:
63
- # 1. 从Hugging Face Hub下载模型文件到本地缓存
64
- model_path = hf_hub_download(
65
- repo_id=MODEL_ID,
66
- filename=MODEL_FILE
67
- )
68
  logging.info(f"模型已成功下载到: {model_path}")
69
-
70
- # 2. 使用llama-cpp-python加载模型
71
  llm = Llama(
72
  model_path=model_path,
73
- n_ctx=4096, # 上下文长度
74
- n_threads=2, # 使用CPU核心数,对于免费版2核CPU是最佳设置
75
- n_gpu_layers=0 # 明确指定在CPU上运行
76
  )
77
  logging.info("AI模型加载成功!API已准备就绪。")
78
-
79
  except Exception as e:
80
  logging.error(f"!!!!!!!!!!!!!! 模型加载失败 !!!!!!!!!!!!!!")
81
  logging.error(f"错误类型: {type(e).__name__}")
@@ -90,23 +45,12 @@ class ChatCompletionRequest(BaseModel):
90
  def chat_completions(request: ChatCompletionRequest):
91
  if llm is None:
92
  return {"error": "模型未能成功加载,API不可用。请检查Space日志。"}
93
-
94
- # llama-cpp-python直接接收OpenAI格式的messages
95
  messages = request.messages
96
-
97
  try:
98
  logging.info("正在生成回复...")
99
- # 直接调用create_chat_completion
100
- completion = llm.create_chat_completion(
101
- messages=messages,
102
- max_tokens=2048,
103
- temperature=0.7
104
- )
105
  logging.info("回复生成成功!")
106
-
107
- # 直接返回OpenAI兼容的格式
108
  return completion
109
-
110
  except Exception as e:
111
  logging.error(f"生成回复时出错: {e}")
112
  return {"error": "生成回复时遇到内部错误。"}
@@ -118,5 +62,4 @@ def read_root():
118
  else:
119
  return {"status": "Prometheus Qwen API is running, but model failed to load."}
120
 
121
- # 在主脚本的开头初始化日志
122
  logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
 
1
  import os
 
 
2
  import logging
3
  from fastapi import FastAPI
4
  from pydantic import BaseModel
5
+ from llama_cpp import Llama
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6
  from huggingface_hub import hf_hub_download
7
 
8
+ # 初始化FastAPI应用
 
 
9
  app = FastAPI()
10
 
11
+ # 定义模型ID和文件名
 
12
  MODEL_ID = "Qwen/Qwen1.5-4B-Chat-GGUF"
 
13
  MODEL_FILE = "qwen1_5-4b-chat-q5_k_m.gguf"
14
 
15
+ # 全局变量来存储模型
16
  llm = None
17
 
18
+ # 在应用启动时加载模型
19
  @app.on_event("startup")
20
  def load_model():
21
  global llm
 
 
 
 
22
  logging.info("正在CPU上使用 llama-cpp-python 加载GGUF模型...")
23
  logging.info(f"目标模型: {MODEL_ID}/{MODEL_FILE}")
24
  try:
25
+ model_path = hf_hub_download(repo_id=MODEL_ID, filename=MODEL_FILE)
 
 
 
 
26
  logging.info(f"模型已成功下载到: {model_path}")
 
 
27
  llm = Llama(
28
  model_path=model_path,
29
+ n_ctx=4096,
30
+ n_threads=2,
31
+ n_gpu_layers=0
32
  )
33
  logging.info("AI模型加载成功!API已准备就绪。")
 
34
  except Exception as e:
35
  logging.error(f"!!!!!!!!!!!!!! 模型加载失败 !!!!!!!!!!!!!!")
36
  logging.error(f"错误类型: {type(e).__name__}")
 
45
  def chat_completions(request: ChatCompletionRequest):
46
  if llm is None:
47
  return {"error": "模型未能成功加载,API不可用。请检查Space日志。"}
 
 
48
  messages = request.messages
 
49
  try:
50
  logging.info("正在生成回复...")
51
+ completion = llm.create_chat_completion(messages=messages, max_tokens=2048, temperature=0.7)
 
 
 
 
 
52
  logging.info("回复生成成功!")
 
 
53
  return completion
 
54
  except Exception as e:
55
  logging.error(f"生成回复时出错: {e}")
56
  return {"error": "生成回复时遇到内部错误。"}
 
62
  else:
63
  return {"status": "Prometheus Qwen API is running, but model failed to load."}
64
 
 
65
  logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
requirements.txt CHANGED
@@ -1,4 +1,5 @@
1
  fastapi
2
  uvicorn
 
3
  pydantic
4
  huggingface-hub
 
1
  fastapi
2
  uvicorn
3
+ llama-cpp-python
4
  pydantic
5
  huggingface-hub