当前位置: 首页 > news >正文

lesson01-PyTorch初见(理论+代码实战)

一、初识PyTorch

二、同类框架

PyTorchVSTensorFlow

三、参数 对比

四、PyTorch生态 

四、常用的网络层 

五、代码分析 

import torch
from torch import autogradx = torch.tensor(1.)
a = torch.tensor(1., requires_grad=True)
b = torch.tensor(2., requires_grad=True)
c = torch.tensor(3., requires_grad=True)y = a**2 * x + b * x + c
  • x 是一个标量,值为 1.0,不需要梯度。
  • abc 都是需要梯度的标量。
  • 函数 y 定义为:
    y=a2⋅x+b⋅x+cy=a2⋅x+b⋅x+c

代入当前值:

  • a=1
  • b=2
  • c=3
  • x=1

所以:

y=12⋅1+2⋅1+3=1+2+3=6y=12⋅1+2⋅1+3=1+2+3=6

梯度计算部分:

print('before:', a.grad, b.grad, c.grad) 
grads = autograd.grad(y, [a, b, c]) 
print('after :', grads[0], grads[1], grads[2])
初始梯度状态(before):

由于还没有进行反向传播,所有 .grad 属性都是 None

输出会是:

before: None None None

计算梯度(autograd.grad):

我们对函数 y=a2⋅x+b⋅x+cy=a2⋅x+b⋅x+c 分别对 a, b, c 求导:

  • ∂a/∂y​=2a⋅x=2⋅1⋅1=2
  • ∂y/∂b=x=1
  • ∂y/∂c=1

所以梯度应该是:

  • grads[0] = 2
  • grads[1] = 1
  • grads[2] = 1

最终输出示例:

before: None None None
after : tensor(2.) tensor(1.) tensor(1.)
  • 这段代码演示了如何使用 torch.autograd.grad 来手动计算多个变量对某个标量输出的梯度。

代码案例二

import 	torch
import  time
print(torch.__version__)
print(torch.cuda.is_available())
# print('hello, world.')a = torch.randn(10000, 1000)
b = torch.randn(1000, 2000)t0 = time.time()
c = torch.matmul(a, b)
t1 = time.time()
print(a.device, t1 - t0, c.norm(2))device = torch.device('cuda')
a = a.to(device)
b = b.to(device)t0 = time.time()
c = torch.matmul(a, b)
t2 = time.time()
print(a.device, t2 - t0, c.norm(2))t0 = time.time()
c = torch.matmul(a, b)
t2 = time.time()
print(a.device, t2 - t0, c.norm(2))

 代码解析

1. 导入模块与基本信息打印

import torch
import timeprint(torch.__version__)
print(torch.cuda.is_available())
  • torch.__version__:输出当前安装的 PyTorch 版本。
  • torch.cuda.is_available():判断当前是否可用 CUDA(即是否有支持的 GPU)。
示例输出:
2.4.0
True

 2. 定义两个大张量用于矩阵乘法

a = torch.randn(10000, 1000)
b = torch.randn(1000, 2000)
  • a 是一个形状为 (10000, 1000) 的随机张量(正态分布)。
  • b 是一个形状为 (1000, 2000) 的随机张量。
  • 矩阵乘法后,结果 c 的形状将是 (10000, 2000)

3. 在 CPU 上进行矩阵乘法并计时

t0 = time.time()
c = torch.matmul(a, b)
t1 = time.time()
print(a.device, t1 - t0, c.norm(2))
  • 使用 torch.matmul(a, b) 计算矩阵乘法。
  • a.device 显示设备信息,默认是 'cpu'
  • t1 - t0 是计算时间差(单位秒)。
  • c.norm(2) 是为了防止编译器优化掉无输出的运算,同时验证结果的一致性。

 4. 将张量移到 GPU 上

device = torch.device('cuda')
a = a.to(device)
b = b.to(device)

5. 第一次在 GPU 上进行矩阵乘法并计时

t0 = time.time()
c = torch.matmul(a, b)
t2 = time.time()
print(a.device, t2 - t0, c.norm(2))
  • 这里会受到 GPU 初始化开销 和 CUDA 内核启动延迟 的影响,第一次运行通常较慢。

6. 第二次在 GPU 上进行矩阵乘法并计时

t0 = time.time()
c = torch.matmul(a, b)
t2 = time.time()
print(a.device, t2 - t0, c.norm(2))
  • 第二次运行没有初始化开销,更能反映真实性能。

预期输出示例(假设你有 GPU)

2.4.0
True
cpu 0.123456 tensor(7070.5678)
cuda:0 0.201234 tensor(7070.5678, device='cuda:0')
cuda:0 0.012345 tensor(7070.5678, device='cuda:0')

✅ 总结分析

操作设备时间 (秒)备注
第一次 matmulCPU~0.12s常规速度
第一次 GPU matmulGPU~0.20s包含初始化和首次调用延迟
第二次 GPU matmulGPU~0.01s实际 GPU 加速效果

🔍 补充说明

  • 为什么第一次 GPU 运行比 CPU 还慢?
    • 因为第一次调用涉及 CUDA 内核启动、内存拷贝、上下文初始化等额外开销
  • 第二次 GPU 调用很快:是因为这些准备工作已经完成,真正体现了 GPU 并行计算的优势。
  • norm(2):用来确保张量被实际计算,避免因“未使用”而被优化掉。

🛠️ 优化建议

如果你要准确测试 GPU 的性能,可以:

  1. 预热(Warm-up):先做几次空跑。

for _ in range(5):_ = torch.matmul(a, b)
torch.cuda.synchronize()  # 同步等待完成

         使用 torch.cuda.Event 来更精确计时

start = torch.cuda.Event(enable_timing=True)
end = torch.cuda.Event(enable_timing=True)start.record()
c = torch.matmul(a, b)
end.record()
torch.cuda.synchronize()
print(start.elapsed_time(end))  # 单位是毫秒

http://www.xdnf.cn/news/448201.html

相关文章:

  • AI数字人实现原理
  • std::ratio<1,1000> 是什么意思?
  • PYTHON训练营DAY25
  • WMS仓储管理系统可以跟哪些系统集成
  • ChatPromptTemplate创建方式比较
  • 2025 uniapp的请求封装工具类以及使用【拿来就用】
  • 虚拟机安装CentOS7网络问题
  • Java 日期解析与格式化:从标准格式到自然语言解析
  • 【Bootstrap V4系列】学习入门教程之 组件-分页(Pagination)
  • 如何利用 Java 爬虫获得京东(JD)商品详情:实战指南
  • windows10 安装 QT
  • 国产之光--腾讯云推出AI编程智能助手CodeBuddy
  • HPE ProLiant DL360 Gen11 服务器,配置 RAID 5 教程!
  • Linux篇 第2章Linux基础指令
  • 【FFmpeg】介绍+安装+VisualStudio配置FFMpeg库
  • 序列化和反序列化:从理论到实践的全方位指南
  • c++STL——哈希表封装:实现高效unordered_map与unordered_set
  • teneo自动机器人部署教程
  • 固定步长和变步长的LMS自适应滤波器算法
  • [Spring]-组件的生命周期
  • 【Linux网络】传输层协议TCP
  • TypeScript泛型:从入门到精通的全方位指南
  • Linux下的c/c++开发之操作Redis数据库
  • 上网行为审计软件系统说明书:上网行为审计是什么?是干啥的?哪家好?
  • AI世界的崩塌:当人类思考枯竭引发数据生态链断裂
  • new optimizers for dl
  • 在Unity中制作拥有36年历史的游戏系列新作《桃太郎电铁世界》
  • 通过宝塔配置HTTPS证书
  • Python爬虫实战:研究拦截器,实现逆向解密
  • UI 原型设计:交互规则的三要素——重要性、原则与实践