背景与问题
在高校和科研机构中,AI相关课程与课题研究往往需要大量计算资源、数据集管理以及多人协作环境。然而,传统本地服务器或单机模式存在以下痛点:
- 环境配置繁琐:不同课程需要不同版本的CUDA、PyTorch/TensorFlow等依赖,环境冲突频繁。
- 资源利用率低:GPU计算资源闲置或过度申请,缺乏统一调度。
- 数据管理混乱:实验数据分散在个人电脑,版本混乱且难以共享。
- 教学评估困难:学生代码作业多,人工批改耗时且标准不一。
为此,我们设计并实现一个基于阿里云产品的AI垂直教学科研平台,整合弹性计算、对象存储、数据库与身份管理,为教师与学生提供一站式服务。
方案设计
平台采用分层架构,核心组件如下:
- 计算层:阿里云ECS(含GPU实例)作为训练与推理节点,通过弹性伸缩应对选课高峰。
- 存储层:阿里云OSS保存数据集、模型文件与作业压缩包,通过生命周期规则进行冷热分层。
- 数据库层:阿里云PolarDB(兼容MySQL)存储课程、学生、作业成绩等元数据。
- 身份与安全:阿里云RAM实现细粒度授权,教师可管理课程资源,学生仅能访问指定Bucket。
整体流程为:学生上传作业到OSS → 触发函数计算或定时任务进行代码检查 → 结果写回PolarDB → 教师通过前端查看成绩。
实现步骤
1. 创建云资源
- 购买一台ECS实例(如ecs.g6.xlarge),安装Python 3.9+。
- 创建OSS Bucket,分为
assignments(学生上传区)和results(结果区),并设置RAM策略。 - 创建PolarDB实例,初始化
course_platform数据库。
2. 初始化数据库表
CREATE TABLE students (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50),
email VARCHAR(100)
);
CREATE TABLE assignments (
id INT PRIMARY KEY AUTO_INCREMENT,
course_id INT,
title VARCHAR(100),
deadline DATETIME
);
CREATE TABLE submissions (
id INT PRIMARY KEY AUTO_INCREMENT,
stu_id INT,
assignment_id INT,
oss_key VARCHAR(255),
score FLOAT,
submitted_at DATETIME
);
3. 编写Python作业批改服务
以下示例演示从OSS下载学生提交的Python脚本,通过静态检查和单元测试计算得分,并将结果写入PolarDB。代码使用阿里云SDK oss2和pymysql,需提前安装:
pip install oss2 pymysql
import oss2
import pymysql
import subprocess
import sys
# 阿里云OSS配置
auth = oss2.Auth('<your-access-key-id>', '<your-access-key-secret>')
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'my-course-bucket')
# PolarDB连接配置
db_config = {
'host': 'your-polardb-host',
'user': 'admin',
'password': 'your-password',
'database': 'course_platform',
'charset': 'utf8mb4'
}
def download_assignment(stu_id, assignment_id):
"""从OSS下载学生作业到本地临时目录"""
key = f'assignments/{stu_id}/{assignment_id}/main.py'
local_path = f'/tmp/{stu_id}_{assignment_id}.py'
bucket.get_object_to_file(key, local_path)
return local_path
def run_unit_tests(local_path):
"""运行内置测试用例,返回得分(0-100)"""
test_code = '''
import sys
sys.path.insert(0, "/tmp")
import {} as student_submit
# 假设作业要求实现add函数
assert student_submit.add(2, 3) == 5
assert student_submit.add(-1, 1) == 0
'''.format(local_path.replace('/', '_').replace('.py', ''))
test_file = '/tmp/test_submit.py'
with open(test_file, 'w') as f:
f.write(test_code)
result = subprocess.run(['python', test_file], capture_output=True, text=True)
if result.returncode == 0:
return 100.0
else:
# 可进一步解析错误,这里简化为50分
return 50.0
def save_score(stu_id, assignment_id, score):
"""将成绩写入PolarDB"""
conn = pymysql.connect(**db_config)
cursor = conn.cursor()
sql = "INSERT INTO submissions (stu_id, assignment_id, oss_key, score, submitted_at) VALUES (%s, %s, %s, %s, NOW())"
cursor.execute(sql, (stu_id, assignment_id, f'assignments/{stu_id}/{assignment_id}/main.py', score))
conn.commit()
cursor.close()
conn.close()
if __name__ == '__main__':
# 示例批改一个学生作业
stu_id = 2024001
assignment_id = 1
local_py = download_assignment(stu_id, assignment_id)
score = run_unit_tests(local_py)
save_score(stu_id, assignment_id, score)
print(f'Student {stu_id} score: {score}')
4. 关键步骤说明
- 配置RAM最小权限:避免使用主账号AccessKey。创建子用户仅授权
oss:GetObject和oss:PutObject对应Bucket路径。 - 使用函数计算触发批改:将上述脚本封装为函数,在OSS出现
assignments/前缀对象时自动触发,实现无服务器批改。 - 数据库连接池:生产环境建议使用
DBUtils.PooledDB代替短连接,避免PolarDB连接数耗尽。
注意事项
- 数据安全:OSS Bucket建议设置为私有,通过STS临时凭证授权学生上传;同时开启日志审计。
- 成本控制:GPU实例按需购买,设定自动释放时间;OSS生命周期规则将30天前的作业归档到低频访问类型。
- 环境隔离:使用ECS自定义镜像为不同课程准备不同镜像,或基于容器服务ACK运行隔离的JupyterHub环境。
- 备份与恢复:PolarDB定期自动备份,OSS开启跨区域复制,确保数据不丢失。
- 合规与隐私:学生成绩属于敏感数据,传输使用HTTPS,数据库字段加密,RAM策略限制数据访问范围。
总结
通过阿里云ECS、OSS、PolarDB和RAM的组合,我们成功构建了一个面向教学科研的AI垂直平台。该平台利用云服务的弹性、安全与自动化特性,显著降低了环境搭建成本,提高了作业批改效率,并为后续扩展GPU训练、模型管理等功能奠定了坚实基础。本文提供的Python代码示例可直接用于原型验证,开发者可根据实际课程需求灵活调整测试逻辑与资源策略。
在AI飞速发展的今天,垂直教学平台不仅是工具,更是连接教学实践与科研创新的桥梁。借助阿里云丰富的产品矩阵,开发者可以快速落地稳定可靠的服务,将更多精力投入课程内容与算法研究本身。