fix:1.修复模型文件被覆盖问题
This commit is contained in:
@@ -10,11 +10,10 @@ import hashlib
|
||||
|
||||
logger = get_logger(__name__)
|
||||
|
||||
# 配置离线模式,避免联网检查
|
||||
os.environ['TRANSFORMERS_OFFLINE'] = '1'
|
||||
os.environ['HF_DATASETS_OFFLINE'] = '1'
|
||||
os.environ['HF_HUB_OFFLINE'] = '1' # 禁用HuggingFace Hub联网
|
||||
os.environ['SENTENCE_TRANSFORMERS_HOME'] = 'data/models' # 设置模型缓存目录
|
||||
# 配置模型缓存目录(不设置离线模式,让它自动选择)
|
||||
# 如果本地有模型就用本地的,没有才联网下载
|
||||
if 'SENTENCE_TRANSFORMERS_HOME' not in os.environ:
|
||||
os.environ['SENTENCE_TRANSFORMERS_HOME'] = 'embedding'
|
||||
|
||||
|
||||
class MemoryService:
|
||||
@@ -46,33 +45,75 @@ class MemoryService:
|
||||
logger.info("🔄 正在加载Embedding模型...")
|
||||
|
||||
# 确保模型缓存目录存在
|
||||
model_cache_dir = 'data/models'
|
||||
model_cache_dir = 'embedding'
|
||||
os.makedirs(model_cache_dir, exist_ok=True)
|
||||
|
||||
# 调试信息:打印环境变量和路径
|
||||
logger.info(f"📂 当前工作目录: {os.getcwd()}")
|
||||
logger.info(f"📂 模型缓存目录: {os.path.abspath(model_cache_dir)}")
|
||||
logger.info(f"🔧 SENTENCE_TRANSFORMERS_HOME: {os.environ.get('SENTENCE_TRANSFORMERS_HOME', '未设置')}")
|
||||
logger.info(f"🔧 TRANSFORMERS_OFFLINE: {os.environ.get('TRANSFORMERS_OFFLINE', '未设置')}")
|
||||
logger.info(f"🔧 HF_HUB_OFFLINE: {os.environ.get('HF_HUB_OFFLINE', '未设置')}")
|
||||
|
||||
# 检查模型目录内容
|
||||
if os.path.exists(model_cache_dir):
|
||||
logger.info(f"📁 模型目录存在,检查内容...")
|
||||
try:
|
||||
items = os.listdir(model_cache_dir)
|
||||
logger.info(f"📁 模型目录内容: {items}")
|
||||
|
||||
# 检查是否有预期的模型文件夹
|
||||
expected_model_dir = os.path.join(model_cache_dir, 'models--sentence-transformers--paraphrase-multilingual-MiniLM-L12-v2')
|
||||
if os.path.exists(expected_model_dir):
|
||||
logger.info(f"✅ 找到本地模型目录: {expected_model_dir}")
|
||||
# 检查快照目录
|
||||
snapshots_dir = os.path.join(expected_model_dir, 'snapshots')
|
||||
if os.path.exists(snapshots_dir):
|
||||
snapshots = os.listdir(snapshots_dir)
|
||||
logger.info(f"📁 模型快照: {snapshots}")
|
||||
else:
|
||||
logger.warning(f"⚠️ 未找到本地模型目录: {expected_model_dir}")
|
||||
except Exception as e:
|
||||
logger.error(f"❌ 检查模型目录失败: {str(e)}")
|
||||
else:
|
||||
logger.warning(f"⚠️ 模型目录不存在: {os.path.abspath(model_cache_dir)}")
|
||||
|
||||
try:
|
||||
logger.info("🔄 尝试加载主模型: sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2")
|
||||
# 优先使用本地缓存的模型
|
||||
# cache_folder会让模型优先从本地加载,只有不存在时才联网下载
|
||||
# 注意:不要设置local_files_only=True,这会阻止fallback到联网下载
|
||||
self.embedding_model = SentenceTransformer(
|
||||
'paraphrase-multilingual-MiniLM-L12-v2',
|
||||
'sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2',
|
||||
cache_folder=model_cache_dir,
|
||||
device='cpu' # 明确指定使用CPU
|
||||
device='cpu', # 明确指定使用CPU
|
||||
trust_remote_code=False # 安全起见
|
||||
)
|
||||
logger.info("✅ Embedding模型加载成功")
|
||||
logger.info("✅ Embedding模型加载成功 (paraphrase-multilingual-MiniLM-L12-v2)")
|
||||
except Exception as e:
|
||||
logger.warning(f"⚠️ 无法加载多语言模型: {str(e)}")
|
||||
logger.info("🔄 尝试使用备用模型...")
|
||||
logger.error(f"❌ 详细错误: {repr(e)}")
|
||||
import traceback
|
||||
logger.error(f"❌ 错误堆栈:\n{traceback.format_exc()}")
|
||||
logger.info("🔄 尝试使用备用模型: sentence-transformers/all-MiniLM-L6-v2")
|
||||
try:
|
||||
# 降级到更小的模型作为备选
|
||||
self.embedding_model = SentenceTransformer(
|
||||
'all-MiniLM-L6-v2',
|
||||
'sentence-transformers/all-MiniLM-L6-v2',
|
||||
cache_folder=model_cache_dir,
|
||||
device='cpu'
|
||||
device='cpu',
|
||||
trust_remote_code=False
|
||||
)
|
||||
logger.info("✅ 使用备用Embedding模型")
|
||||
logger.info("✅ 使用备用Embedding模型 (all-MiniLM-L6-v2)")
|
||||
except Exception as e2:
|
||||
logger.error(f"❌ 所有模型加载失败: {str(e2)}")
|
||||
logger.error(f"❌ 详细错误: {repr(e2)}")
|
||||
import traceback
|
||||
logger.error(f"❌ 错误堆栈:\n{traceback.format_exc()}")
|
||||
logger.error("💡 模型首次使用需要联网下载(约420MB)")
|
||||
logger.error(" 或手动下载模型文件到 data/models 目录")
|
||||
logger.error(" 或手动下载模型文件到 embedding 目录")
|
||||
logger.error(f"💡 期望的模型目录结构:")
|
||||
logger.error(f" {os.path.abspath(model_cache_dir)}/models--sentence-transformers--paraphrase-multilingual-MiniLM-L12-v2/")
|
||||
raise RuntimeError("无法加载任何Embedding模型")
|
||||
|
||||
self._initialized = True
|
||||
|
||||
Reference in New Issue
Block a user