Python for MLOps - 第一阶段学习笔记
🎯 学习目标
• 巩固 Python 高级语法
• 掌握配置管理与工程化组织方式
• 构建可维护、可配置、具备日志能力的训练脚本框架
✅ 学习模块总结
1. 类型注解(typing)
• 关键类型:List, Dict, Optional, Union, Callable
• 好处:提升代码可读性、支持 IDE 提示和静态检查(如 mypy)
示例:
python
from typing import List, Dict, Union
def square_all(numbers: List[int]) -> List[int]:
return [n**2 for n in numbers]
def get_config() -> Dict[str, Union[float, int]]:
return {"lr": 0.01, "epochs": 10}
2. 数据类(dataclasses)
• 用 @dataclass 快速定义带默认值的数据结构
• 自动生成 init , repr 等方法
示例:
python
from dataclasses import dataclass
@dataclass
class TrainConfig:
lr: float
epochs: int
batch_size: int = 32
device: str = "cuda"
3. YAML 配置加载(pyyaml)
• 用于从 .yaml 文件中读取训练参数配置
• 搭配 dataclass 实现结构化配置
示例:
python
import yaml
from pathlib import Path
def load_config(path: Path) -> TrainConfig:
with open(path, 'r') as f:
data = yaml.safe_load(f)
return TrainConfig(**data)
4. 命令行参数(argparse)
• 支持运行时覆盖 YAML 配置
• 常用于快速试验不同参数组合
示例:
ini
from argparse import ArgumentParser
parser = ArgumentParser()
parser.add_argument("--config", default="configs/config.yaml")
parser.add_argument("--lr", type=float)
parser.add_argument("--device", type=str)
args = parser.parse_args()
5. 日志记录(logging)
• 替代 print,可输出到终端和日志文件
• 支持日志格式统一、自动保存训练信息
示例:
ini
import logging
def setup_logger(log_file: Path = None) -> logging.Logger:
logger = logging.getLogger("uvlearn")
logger.setLevel(logging.INFO)
if not logger.handlers:
ch = logging.StreamHandler()
logger.addHandler(ch)
if log_file:
fh = logging.FileHandler(log_file, mode='w')
logger.addHandler(fh)
return logger
6. 项目结构组织
bash
uvlearn/
├── configs/ # 存放 YAML 配置
│ └── config.yaml
├── src/
│ ├── config.py # 配置结构与加载逻辑
│ ├── trainer.py # 训练逻辑(可模拟/使用 PyTorch)
│ └── utils.py # 通用工具(日志、contextlib等)
└── train_entry.py # 项目入口
7. pathlib 的使用
• 用 / 拼接路径
• 可跨平台,简洁直观
示例:
ini
from pathlib import Path
log_file = Path("logs") / "train.log"
log_file.parent.mkdir(exist_ok=True)
8. contextlib.contextmanager
• 用函数实现 with 语法的资源管理
• 避免忘记关闭资源或释放连接
示例:
python
from contextlib import contextmanager
@contextmanager
def demo_resource(name="默认资源"):
print(f"[{name}] 资源准备")
try:
yield f"{name} 使用中"
finally:
print(f"[{name}] 资源清理完成")
📝 明日测验预告
我将准备一道综合题,考察你对以下内容的掌握:
• 类型注解
• dataclass 配置
• argparse 覆盖
• YAML 加载
• 日志输出
• contextmanager 使用
题型风格为"动手补全/分析代码",你会喜欢的 😄