LLM备份策略
--- title: "LLM备份策略" description: "详细介绍LLM系统的备份策略,包括模型权重备份、训练数据备份、配置文件备份、向量数据库备份以及增量备份与异地容灾方案" tags: ["备份策略", "数据保护", "模型备份", "容灾"] category: "llm" icon: "🧠"
LLM备份策略
备份的重要性
LLM系统的数据资产包括模型权重、训练数据、配置文件、向量数据库索引等。这些数据的丢失可能导致数周甚至数月的工作付诸东流。完善的备份策略是数据保护的基础,也是灾难恢复的前提条件。
需要备份的核心资产
模型权重
模型权重是LLM系统最核心的资产。一个经过微调的模型可能花费大量计算资源训练而成。
- 基础模型权重:从HuggingFace等平台下载的预训练模型
- 微调模型权重:经过LoRA、QLoRA等技术微调后的模型
- 适配器权重:单独保存的LoRA适配器文件
训练数据
包括原始数据集、清洗后的数据、指令数据、人工标注数据等。
配置与元数据
训练配置、超参数、实验记录、评估结果等辅助信息。
备份策略设计
3-2-1备份原则
这是业界广泛认可的备份最佳实践:
- 3份副本:数据至少保留3份拷贝
- 2种介质:使用2种不同的存储介质
- 1份异地:至少1份备份存放在异地
class BackupStrategy:
def __init__(self):
self.retention_policy = {
'daily': 7, # 保留7天日备份
'weekly': 4, # 保留4周周备份
'monthly': 12, # 保留12个月月备份
}
def should_backup(self, file_path, last_backup_time):
"""判断是否需要备份"""
elapsed = time.time() - last_backup_time
if elapsed > 86400: # 超过24小时
return True
return False
def get_backup_destinations(self):
"""返回所有备份目标"""
return [
LocalStorage('/backup/local'),
NASStorage('nas://backup-share'),
S3Storage('s3://my-llm-backup'),
]
增量备份与全量备份
全量备份:复制所有数据,耗时长但恢复简单。适合定期执行,如每周一次。
增量备份:仅复制自上次备份以来变更的数据,效率高但恢复时需要结合全量备份。适合日常执行。
# 全量备份
tar -czf /backup/full_model_$(date +%Y%m%d).tar.gz /models/
# 增量备份(基于tar的增量机制)
tar -czf /backup/incr_model_$(date +%Y%m%d).tar.gz \
--newer=/backup/last_backup.timestamp /models/
# 更新时间戳
touch /backup/last_backup.timestamp
模型权重备份实现
import hashlib
import shutil
from pathlib import Path
class ModelBackup:
def __init__(self, model_dir, backup_root):
self.model_dir = Path(model_dir)
self.backup_root = Path(backup_root)
def backup(self, version_tag=None):
tag = version_tag or datetime.now().strftime('%Y%m%d_%H%M%S')
dest = self.backup_root / f'model_{tag}'
dest.mkdir(parents=True, exist_ok=True)
for weight_file in self.model_dir.glob('*.safetensors'):
shutil.copy2(weight_file, dest / weight_file.name)
checksums = self._compute_checksums(dest)
(dest / 'checksums.json').write_text(json.dumps(checksums))
return dest
def _compute_checksums(self, directory):
checksums = {}
for f in directory.iterdir():
if f.is_file() and f.name != 'checksums.json':
checksums[f.name] = hashlib.sha256(f.read_bytes()).hexdigest()
return checksums
def verify(self, backup_path):
backup_dir = Path(backup_path)
checksums = json.loads((backup_dir / 'checksums.json').read_text())
for filename, expected_hash in checksums.items():
actual_hash = hashlib.sha256(
(backup_dir / filename).read_bytes()
).hexdigest()
if actual_hash != expected_hash:
return False, filename
return True, None
向量数据库备份
向量数据库中的索引数据同样需要定期备份。ChromaDB、Pinecone等数据库通常提供导出接口或需要定期快照底层存储。
def backup_vectordb(client, collection_name, backup_path):
collection = client.get_collection(collection_name)
all_data = collection.get(include=['documents', 'embeddings', 'metadatas'])
backup_data = {
'collection': collection_name,
'documents': all_data['documents'],
'embeddings': all_data['embeddings'].tolist(),
'metadatas': all_data['metadatas'],
'timestamp': datetime.now().isoformat(),
}
with open(backup_path, 'w') as f:
json.dump(backup_data, f)
备份监控与告警
备份任务必须有监控和告警机制。当备份失败、备份超时、备份数据不完整时,运维团队应立即收到通知。建议在备份完成后自动执行完整性校验,确保备份数据可正常用于恢复。