跳转至

Python

990 个字 19 行代码 预计阅读时间 4 分钟

Python 作为一门新兴的解释型语言,尽管其运行的效率远不及 C/C++ Fortran 等编译型语言,但由于其在 AI 领域的广泛运用以及其作为脚本语言的强大功能,我们仍需要掌握基础的 Python 知识。

本部分主要掌握 Python 的基础语法与数据结构和 pytorchmpi4py 的使用。

事实上,在 ChatGPT 等大语言模型的普及背景下,我们不需要完全记忆下述内容,只需要构建相关框架,能够在需要使用时让大语言模型帮助我们编写出对应程序即可。

python 环境搭建

推荐 IDEvscode+python 插件,Pycharm

python 安装教程

python 基础

该部分需要掌握基础的 python 程序编写和常见的 python 数据结构的用法。

基础语法 :

  • 打印语句:print()
  • 注释:单行注释和多行注释
  • 变量和数据类型
  • 基本运算符:算术运算符、比较运算符、逻辑运算符
  • 条件语句:if、elif、else
  • 循环语句:for、while

数据结构 :

本部分练习 :

不使用任何第三方库,尝试编写程序使用定积分的定义计算 \(\int_{0}^{1} \frac{1}{x^2+1} \, dx\) 的值。

PyTorch

PyTorch 是一个由 Facebook 的人工智能研究团队开发的开源深度学习框架,以其易用性、灵活性和强大的功能在科研社区中广受欢迎。其也常常作为 AI 大模型赛题的实现框架。

PyTorch 官网

该部分要求掌握 PyTorch 张量运算的基本规则(选学)学习编写 PyTorch 的算子的方法。

参考链接 :

张量的基本运算

PyTorch 自定义算子手册

本部分练习 :

  1. 使用 PyTorch 的张量类型,编写程序使用定积分的定义计算 \(\int_{0}^{y} \frac{1}{x^2+1} \, dx\) 的值
    • 输入:一维 torch.Tensor 张量,每个数字代表一个 y 的取值。
    • 输出:一维 torch.Tensor 张量,每个位置对应于输入的 y 计算得到的定积分的值。
  2. (选做)自己编写一个 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

本部分练习 :

  1. hello,mpi4py.

    • 编写程序运行后打印自己的 rank 与当前的 size 并退出。
  2. mpi4py 库中的点对点通信 (ping - pong)

    • 编写程序让程序开始运行时 0 号进程发送 'ping' 信息给 1 号进程,1 号进程发送 'pong' 信息给 0 号进程
    • 1 号进程每次收到 0 号进程消息后打印输出并等待 1s 后返回 'pong' 信息给 0 号进程
    • 0 号进程每次收到 1 号进程消息后打印输出并等待 1s 后返回 'ping' 信息给 0 号进程
  3. 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]]
      '''