File size: 8,165 Bytes
e9e8684
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
"""
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))