Spaces:
Paused
Paused
| """ | |
| Kaggle Ollama 保存脚本 | |
| 将 Ollama 和模型保存到 Kaggle Dataset,下次直接使用 | |
| 使用步骤: | |
| 1. 首次运行: 安装 Ollama 和下载模型后,运行本脚本保存 | |
| 2. 后续使用: 使用 KAGGLE_LOAD_OLLAMA.py 从 Dataset 加载 | |
| 注意: 需要手动创建 Kaggle Dataset 并上传 | |
| """ | |
| import os | |
| import subprocess | |
| import shutil | |
| import tarfile | |
| import time | |
| from pathlib import Path | |
| print("="*70) | |
| print("💾 Kaggle Ollama 保存工具") | |
| print("="*70) | |
| # ==================== 配置 ==================== | |
| OUTPUT_DIR = "/kaggle/working/ollama_backup" | |
| MODEL_NAME = "mistral" # 或者 "phi", "tinyllama" 等 | |
| print(f"\n📋 配置:") | |
| print(f" 模型: {MODEL_NAME}") | |
| print(f" 输出目录: {OUTPUT_DIR}") | |
| # ==================== 步骤 1: 创建输出目录 ==================== | |
| print(f"\n📁 步骤 1/4: 创建备份目录...") | |
| os.makedirs(OUTPUT_DIR, exist_ok=True) | |
| print(f" ✅ 目录创建成功") | |
| # ==================== 步骤 2: 备份 Ollama 二进制文件 ==================== | |
| print(f"\n📦 步骤 2/4: 备份 Ollama 二进制文件...") | |
| ollama_bin = shutil.which('ollama') | |
| if ollama_bin: | |
| print(f" 找到 Ollama: {ollama_bin}") | |
| # 复制二进制文件 | |
| shutil.copy2(ollama_bin, os.path.join(OUTPUT_DIR, 'ollama')) | |
| print(f" ✅ Ollama 二进制文件已备份") | |
| else: | |
| print(f" ❌ 未找到 Ollama,请先安装") | |
| exit(1) | |
| # ==================== 步骤 3: 备份模型文件 ==================== | |
| print(f"\n🤖 步骤 3/4: 备份 {MODEL_NAME} 模型...") | |
| # Ollama 模型存储位置(可能在不同位置) | |
| possible_model_dirs = [ | |
| os.path.expanduser("~/.ollama/models"), | |
| "/root/.ollama/models", | |
| os.path.expanduser("~/.ollama") | |
| ] | |
| ollama_models_dir = None | |
| for dir_path in possible_model_dirs: | |
| if os.path.exists(dir_path) and os.path.isdir(dir_path): | |
| # 检查是否有内容 | |
| if os.listdir(dir_path): | |
| ollama_models_dir = os.path.dirname(dir_path) if dir_path.endswith('models') else dir_path | |
| break | |
| if ollama_models_dir and os.path.exists(ollama_models_dir): | |
| print(f" 找到模型目录: {ollama_models_dir}") | |
| # 计算目录大小 | |
| total_size = sum( | |
| os.path.getsize(os.path.join(dirpath, filename)) | |
| for dirpath, dirnames, filenames in os.walk(ollama_models_dir) | |
| for filename in filenames | |
| ) | |
| print(f" 模型总大小: {total_size / (1024**3):.2f} GB") | |
| # 创建压缩包(整个 .ollama 目录) | |
| models_archive = os.path.join(OUTPUT_DIR, 'ollama_models.tar.gz') | |
| print(f" 📦 创建压缩包(这可能需要几分钟)...") | |
| print(f" 正在压缩: {ollama_models_dir}") | |
| start_time = time.time() | |
| with tarfile.open(models_archive, 'w:gz') as tar: | |
| tar.add(ollama_models_dir, arcname='.ollama') | |
| elapsed = time.time() - start_time | |
| archive_size = os.path.getsize(models_archive) / (1024**3) | |
| print(f" ✅ 压缩完成") | |
| print(f" 耗时: {int(elapsed)}秒") | |
| print(f" 压缩包大小: {archive_size:.2f} GB") | |
| else: | |
| print(f" ❌ 未找到模型目录") | |
| print(f" 请先运行: ollama pull {MODEL_NAME}") | |
| exit(1) | |
| # ==================== 步骤 4: 生成说明文件 ==================== | |
| print(f"\n📝 步骤 4/4: 生成说明文件...") | |
| readme_content = f"""# Ollama 备份包 | |
| ## 内容 | |
| - `ollama`: Ollama 二进制文件 | |
| - `ollama_models.tar.gz`: 模型文件压缩包(包含 {MODEL_NAME}) | |
| ## 备份信息 | |
| - 备份时间: {time.strftime('%Y-%m-%d %H:%M:%S')} | |
| - 模型: {MODEL_NAME} | |
| - 压缩包大小: {archive_size:.2f} GB | |
| ## 使用方法 | |
| ### 1. 创建 Kaggle Dataset | |
| 1. 下载此目录中的所有文件到本地 | |
| 2. 在 Kaggle 网站创建新 Dataset: | |
| - 访问: https://www.kaggle.com/datasets | |
| - 点击 "New Dataset" | |
| - 上传 `ollama` 和 `ollama_models.tar.gz` | |
| - 命名为: `ollama-{MODEL_NAME}-backup` | |
| - 设置为 Private | |
| - 点击 "Create" | |
| ### 2. 在 Notebook 中加载 | |
| 在 Kaggle Notebook 中: | |
| 1. 添加 Dataset: | |
| - 点击右侧 "Add data" → "Your Datasets" | |
| - 选择你创建的 `ollama-{MODEL_NAME}-backup` | |
| 2. 运行加载脚本: | |
| ```python | |
| # 使用项目中的 KAGGLE_LOAD_OLLAMA.py | |
| exec(open('/kaggle/working/adaptive_RAG/KAGGLE_LOAD_OLLAMA.py').read()) | |
| ``` | |
| ### 3. 验证 | |
| ```bash | |
| # 检查 Ollama | |
| ollama --version | |
| # 检查模型 | |
| ollama list | |
| # 测试运行 | |
| ollama run {MODEL_NAME} "Hello" | |
| ``` | |
| ## 文件大小参考 | |
| 不同模型的压缩包大小(近似值): | |
| - qwen:0.5b: ~350 MB | |
| - tinyllama: ~600 MB | |
| - phi: ~1.6 GB | |
| - mistral: ~4 GB | |
| - llama2:7b: ~3.8 GB | |
| ## 注意事项 | |
| 1. ⚠️ Dataset 大小限制: | |
| - 免费用户: 每个 Dataset 最大 20GB | |
| - 需要确保压缩包 < 20GB | |
| 2. ⚠️ 上传时间: | |
| - 取决于你的网络速度 | |
| - 4GB 文件可能需要 10-30 分钟 | |
| 3. ✅ 优势: | |
| - 只需上传一次 | |
| - 每次 Notebook 启动时直接加载(秒级) | |
| - 节省大量时间 | |
| ## 故障排除 | |
| ### 问题: 上传失败 | |
| 解决: 检查网络连接,或分多次上传 | |
| ### 问题: Dataset 过大 | |
| 解决: 使用更小的模型(如 phi 或 tinyllama) | |
| ### 问题: 加载后 Ollama 无法运行 | |
| 解决: 检查文件权限,运行 `chmod +x /usr/local/bin/ollama` | |
| """ | |
| readme_file = os.path.join(OUTPUT_DIR, 'README.md') | |
| with open(readme_file, 'w', encoding='utf-8') as f: | |
| f.write(readme_content) | |
| print(f" ✅ 说明文件已生成") | |
| # ==================== 生成加载脚本(供参考) ==================== | |
| loader_script = os.path.join(OUTPUT_DIR, 'load_example.py') | |
| with open(loader_script, 'w', encoding='utf-8') as f: | |
| f.write(f'''""" | |
| 示例: 从 Kaggle Dataset 加载 Ollama | |
| """ | |
| import os | |
| import subprocess | |
| import tarfile | |
| import shutil | |
| # Dataset 路径(根据你的 Dataset 名称修改) | |
| DATASET_PATH = "/kaggle/input/ollama-{MODEL_NAME}-backup" | |
| print("📦 从 Dataset 加载 Ollama...") | |
| # 1. 复制 Ollama 二进制文件 | |
| ollama_bin = os.path.join(DATASET_PATH, "ollama") | |
| if os.path.exists(ollama_bin): | |
| shutil.copy2(ollama_bin, "/usr/local/bin/ollama") | |
| os.chmod("/usr/local/bin/ollama", 0o755) | |
| print("✅ Ollama 二进制文件已安装") | |
| # 2. 解压模型文件 | |
| models_archive = os.path.join(DATASET_PATH, "ollama_models.tar.gz") | |
| if os.path.exists(models_archive): | |
| print("📦 解压模型文件...") | |
| with tarfile.open(models_archive, 'r:gz') as tar: | |
| tar.extractall(os.path.expanduser("~/.ollama")) | |
| print("✅ 模型已解压") | |
| # 3. 启动 Ollama 服务 | |
| print("🚀 启动 Ollama 服务...") | |
| subprocess.Popen(['ollama', 'serve']) | |
| import time | |
| time.sleep(15) | |
| print("✅ Ollama 已准备就绪!") | |
| print("\\n验证:") | |
| subprocess.run(['ollama', 'list']) | |
| ''') | |
| print(f" ✅ 示例脚本已生成") | |
| # ==================== 显示文件列表 ==================== | |
| print(f"\n📊 备份内容:") | |
| for item in os.listdir(OUTPUT_DIR): | |
| item_path = os.path.join(OUTPUT_DIR, item) | |
| size = os.path.getsize(item_path) | |
| size_str = f"{size / (1024**3):.2f} GB" if size > 1024**3 else f"{size / (1024**2):.2f} MB" | |
| print(f" • {item}: {size_str}") | |
| # ==================== 后续步骤说明 ==================== | |
| print("\n" + "="*70) | |
| print("✅ 备份完成!") | |
| print("="*70) | |
| print(f"\n📋 后续步骤:") | |
| print(f""" | |
| 1. 下载备份文件到本地: | |
| 在 Kaggle Notebook 右侧 Output 中下载 {OUTPUT_DIR} 目录 | |
| 2. 创建 Kaggle Dataset: | |
| • 访问: https://www.kaggle.com/datasets | |
| • 点击 "New Dataset" | |
| • 上传以下文件: | |
| - ollama (二进制文件) | |
| - ollama_models.tar.gz (模型压缩包) | |
| • 命名: ollama-{MODEL_NAME}-backup | |
| • 点击 "Create" | |
| 3. 下次使用: | |
| • 在 Notebook 中添加你的 Dataset | |
| • 运行 KAGGLE_LOAD_OLLAMA.py 脚本 | |
| • 即可秒级加载,无需重新下载! | |
| ⏱️ 时间对比: | |
| • 传统方式: 每次启动需要 5-10 分钟下载 | |
| • Dataset 方式: 每次启动只需 10-20 秒加载 | |
| • 节省时间: 每次节省 5-10 分钟! | |
| 💡 提示: | |
| • 上传 Dataset 是一次性工作 | |
| • 之后每次 Notebook 启动都能快速加载 | |
| • 强烈推荐! | |
| """) | |
| print("\n查看详细说明: cat {}/README.md".format(OUTPUT_DIR)) | |