Python¶
Python作为一门新兴的解释型语言,尽管其运行的效率远不及C/C++与Fortran等编译型语言,但由于其在AI领域的广泛运用以及其作为脚本语言的强大功能,我们仍需要掌握基础的Python知识。
本部分主要掌握Python的基础语法与数据结构和pytorch、mpi4py的使用。
事实上,在ChatGPT等大语言模型的普及背景下,我们不需要完全记忆下述内容,只需要构建相关框架,能够在需要使用时让大语言模型帮助我们编写出对应程序即可。
python环境搭建¶
推荐IDE:vscode+python插件,Pycharm
python基础¶
该部分需要掌握基础的python程序编写和常见的python数据结构的用法。
基础语法:
数据结构:
- 列表(List):定义、遍历、列表操作
- 元组(Tuple):定义、不可变性、元组与列表的区别
- 字典(Dictionary):定义、键值对、字典操作
- 集合(Set):定义、集合操作
本部分练习:
不使用任何第三方库,尝试编写程序使用定积分的定义计算\(\int_{0}^{1} \frac{1}{x^2+1} \, dx\)的值。
PyTorch¶
PyTorch是一个由Facebook的人工智能研究团队开发的开源深度学习框架,以其易用性、灵活性和强大的功能在科研社区中广受欢迎。其也常常作为AI大模型赛题的实现框架。
该部分要求掌握PyTorch张量运算的基本规则,(选学)学习编写PyTorch的算子的方法。
参考链接:
本部分练习:
- 使用PyTorch的张量类型,编写程序使用定积分的定义计算\(\int_{0}^{y} \frac{1}{x^2+1} \, dx\)的值
- 输入:一维torch.Tensor张量,每个数字代表一个y的取值。
- 输出:一维torch.Tensor张量,每个位置对应于输入的y计算得到的定积分的值。
- (选做)自己编写一个PyTorch算子(基于C++或CUDA),输入一个张量x,返回张量\(\frac{1}{x^2+1}\)。并在python中调用这个算子运用定积分的定义计算\(\int_{0}^{y} \frac{1}{x^2+1} \, dx\)的值(输入输出要求与1中相同)
mpi4py(选学)¶
mpi4py是一个Python库,提供了MPI(消息传递接口)的绑定,使得Python程序能够进行并行计算。它支持多种并行模式,包括点对点通信、集合通信(如广播、分散和聚集)以及使用NumPy数组的快速缓冲区通信。
尽管python中自带有multiprocessing库实现多进程,但是其只能在单机上实现并行。如果需要使用多机的并行仍需使用mpi4py。
本部分练习:
-
hello,mpi4py.
- 编写程序运行后打印自己的rank与当前的size并退出。
-
mpi4py库中的点对点通信(ping - pong)
- 编写程序让程序开始运行时0号进程发送'ping'信息给1号进程,1号进程发送'pong'信息给0号进程
- 1号进程每次收到0号进程消息后打印输出并等待1s后返回'pong'信息给0号进程
- 0号进程每次收到1号进程消息后打印输出并等待1s后返回'ping'信息给0号进程
-
mpi4py库中的集合通信
- 编写函数mpi_np_gather(send_buffer: np.ndarray)-> np.ndarray。
- 实现功能:send_buffer为将发送二维的np.ndarray对象,所有进程发送的np.ndarray对象列数相同,行数可以不同。返回值为各个程序的发送的np.ndarray对象按照rank的顺序拼接而成的np.ndarray数组。
- 示例:
# 假设size=4 if rank == 0: mpi_np_gather(np.array([[0,1]])) elif rank == 1: mpi_np_gather(np.array([[1,0],[2,3]])) elif rank == 2: mpi_np_gather(7*np.ones((3,2))) elif rank == 3: print(mpi_np_gather(np.array[[114, 514]]) ''' 输出结果: [[0 1] [1 0] [2 3] [7 7] [7 7] [7 7] [114 514]] '''