一文详解如何用GPU来运行Python代码

一文详解如何用GPU来运行Python代码

简介

Python 是一种流行的编程语言, 具有灵活性和易于使用的特点。然而,Python 非常慢,不能直接用于处理计算密集型任务。幸运的是,我们可以使用 GPU 加速来提高 Python 的运算速度。

本文将讨论如何在常见的深度学习编程框架中使用 GPU。我们将讨论 TensorFlow, PyTorch 和 MXNet。此外,我们将介绍如何在 Google Colab 和 Anaconda 中设置 GPU。

设置 GPU

在使用 GPU 之前,首先需要使用命令来安装必要的软件包。例如,在使用 TensorFlow 之前,需要使用以下命令安装 TensorFlow:

!pip install tensorflow-gpu

使用 GPU 可以使用 Nvidia 的 CUDA 和 cuDNN 库。确保使用的 CUDA 和 cuDNN 版本与您正在使用的深度学习框架的版本相匹配。

Google Colab

如果使用 Google Colab 进行深度学习项目,则可以使用以下代码启用 GPU:

import tensorflow as tf

# check if tensorflow can see the GPU
device_name = tf.test.gpu_device_name() or "CPU"
print(f"Running on {device_name}")

如果您看到以下输出,则说明您的 Colab 框架支持 GPU 运算:

Running on /device:GPU:0

Anaconda

如果使用 Anaconda 进行深度学习项目,则可以使用以下命令来创建支持 GPU 的环境:

conda create --name gpu_env tensorflow-gpu

然后,使用以下命令激活环境:

conda activate gpu_env

示例

TensorFlow

在 TensorFlow 中使用 GPU 可以大大加速训练和测试过程。以下示例演示如何在 TensorFlow 中使用 GPU。

import tensorflow as tf

# create a simple neural network model
model = tf.keras.Sequential([
    tf.keras.layers.Dense(512, activation='relu', input_shape=(784,)),
    tf.keras.layers.Dropout(0.2),
    tf.keras.layers.Dense(10)
])

# load MNIST dataset
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()

# pre-process the data
x_train = x_train.reshape((60000, 784))
x_test = x_test.reshape((10000, 784))
x_train, x_test = x_train / 255.0, x_test / 255.0

# compile and fit the model
model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

model.fit(x_train, y_train, epochs=5, batch_size=32, validation_data=(x_test, y_test))

PyTorch

使用 GPU 可以通过减少训练和测试时间来提高 PyTorch 模型的计算速度和性能。以下示例演示了如何使用 PyTorch 中的 GPU:

import torch

# specify device
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print(device)

# set up a simple neural network model
model = torch.nn.Sequential(
        torch.nn.Linear(784, 512),
        torch.nn.ReLU(),
        torch.nn.Dropout(0.2),
        torch.nn.Linear(512, 10))

model.to(device)

# load MNIST dataset
train_set = torch.utils.data.DataLoader(
    torchvision.datasets.MNIST('./data', train=True, download=True,
                               transform=torchvision.transforms.Compose([
                                   torchvision.transforms.ToTensor(),
                                   torchvision.transforms.Normalize((0.1307,), (0.3081,))
                               ])),
    batch_size=32, shuffle=True)

test_set = torch.utils.data.DataLoader(
    torchvision.datasets.MNIST('./data', train=False, download=True,
                               transform=torchvision.transforms.Compose([
                                   torchvision.transforms.ToTensor(),
                                   torchvision.transforms.Normalize((0.1307,), (0.3081,))
                               ])),
    batch_size=32, shuffle=True)

# specify loss function and optimizer
loss_fn = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.5)

# train and test the model
def train(epoch):
    model.train()
    for batch_idx, (data, target) in enumerate(train_set):
        data, target = data.to(device), target.to(device)
        optimizer.zero_grad()
        output = model(data.view(data.shape[0], -1))
        loss = loss_fn(output, target)
        loss.backward()
        optimizer.step()

        if batch_idx % 100 == 0:
            print(f"Train Epoch: {epoch} [{batch_idx * len(data)} / {len(train_set.dataset)} "\
                  f"({100. * batch_idx / len(train_set)}%)], Loss: {loss.item()}")

def test():
    model.eval()
    test_loss = 0
    correct = 0
    with torch.no_grad():
        for data, target in test_set:
            data, target = data.to(device), target.to(device)
            output = model(data.view(data.shape[0], -1))
            test_loss += loss_fn(output, target).item()
            pred = output.argmax(dim=1, keepdim=True)
            correct += pred.eq(target.view_as(pred)).sum().item()

    test_loss /= len(test_set.dataset)
    print(f"\nTest set: Average loss: {test_loss:.4f}, "\
          f"Accuracy: {correct}/{len(test_set.dataset)} ({100. * correct / len(test_set.dataset)}%)\n")


for epoch in range(1, 6):
    train(epoch)
    test()

MXNet

以下示例将使用 MXNet 中的 GPU 运行 Logistic 回归:

import mxnet as mx
from mxnet import nd, autograd, gluon

# set up a simple logistic regression model
model = gluon.nn.Sequential()
with model.name_scope():
    model.add(gluon.nn.Dense(10))

ctx = mx.gpu() if mx.context.num_gpus() > 0 else mx.cpu()

model.initialize(mx.init.Xavier(), ctx=ctx)

# load MNIST dataset
batch_size = 32
train_data = gluon.data.DataLoader(gluon.data.vision.MNIST(train=True).transform_first(transformer),
                                      batch_size=batch_size, shuffle=True, num_workers=2)
test_data = gluon.data.DataLoader(gluon.data.vision.MNIST(train=False).transform_first(transformer),
                                     batch_size=batch_size, num_workers=2)

# specify loss function and optimizer
cross_entropy_loss = gluon.loss.SoftmaxCrossEntropyLoss()
trainer = gluon.Trainer(model.collect_params(), 'sgd', {'learning_rate': 0.1})

# train and test the model
def train(epochs):
    for epoch in range(epochs):
        running_loss = 0.0
        for i, (data, label) in enumerate(train_data):
            data = data.as_in_context(ctx)
            label = label.as_in_context(ctx)
            with autograd.record():
                output = model(data)
                loss = cross_entropy_loss(output, label)

            loss.backward()
            trainer.step(batch_size)

            running_loss += nd.mean(loss).asscalar()

        print(f"Epoch {epoch+1}, train_loss: {running_loss / len(train_data)}")
        test()

def test():
    test_acc = mx.metric.Accuracy()
    for data, label in test_data:
        data = data.as_in_context(ctx)
        label = label.as_in_context(ctx)
        output = model(data)
        predictions = nd.argmax(output, axis=1)
        test_acc.update(preds=predictions, labels=label)

    _, test_acc_value = test_acc.get()
    print(f"test_accuracy: {test_acc_value:.4f}")


train(5)

总结

在本文中,我们讨论了如何在运行 Python 代码时使用 GPU。我们演示了在 TensorFlow,PyTorch 和 MXNet 中使用 GPU 运行代码,并提供了在 Google Colab 和 Anaconda 中启用 GPU 的说明。使用 GPU 可以显著提高处理计算密集型任务的速度和性能。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一文详解如何用GPU来运行Python代码 - Python技术站

(0)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • Python格式化输出的具体实现

    当我们需要将变量值以指定的格式输出的时候,就需要使用到Python的格式化输出。Python中的格式化输出可以使用字符串格式化符号或format()方法。 字符串格式化符号 Python中常用的字符串格式化符号有: %s 字符串 (无限制长度) %d 整数 %f 浮点数 %e 科学计数法形式的浮点数 %o 八进制数 %x 十六进制数 (小写字母形式) %f …

    python 2023年5月19日
    00
  • 趣味Python实战练习之自动更换桌面壁纸脚本附源码

    让我来详细讲解一下“趣味Python实战练习之自动更换桌面壁纸脚本附源码”的完整攻略。 1. 项目介绍 本项目是一个Python实战练习,旨在通过编写一个自动更换桌面壁纸脚本,锻炼Python编程能力。 2. 项目要求 实现一个定时自动更换桌面壁纸的脚本,支持手动更换和定时更换两种方式。脚本通过爬取指定壁纸网站的图片,将图片下载到本地,然后设置为桌面壁纸。同…

    python 2023年5月19日
    00
  • python面向对象版学生信息管理系统

    Python面向对象版学生信息管理系统完整攻略 简介 Python面向对象版学生信息管理系统是一款基于Python语言开发的管理系统,能够实现对学生信息的增、删、改和查等基本操作。本攻略将介绍如何使用Python面向对象的方法完成该系统的开发。 实现过程 第一步:设计数据结构 学生类(Student):包含学生的姓名、性别、年龄、学号、成绩等信息; 学生管理…

    python 2023年5月30日
    00
  • Python3多线程详解

    Python3多线程详解 Python3中的多线程模块是_thread和threading。_thread是低级模块,thread是高级模块,对_thread`进行了封装,使得使用更加方便。本文将详细介绍Python3多线程的使用方法。 创建线程 Python中创建线程有两种方式:使用_thread模块和使用threading模块。下面是两种方式的示例: 使…

    python 2023年5月13日
    00
  • Python自动化办公实战案例详解(Word、Excel、Pdf、Email邮件)

    Python自动化办公实战案例详解 Python自动化办公介绍 Python自带许多能够处理文本、文件、网络和数据的模块和库,使得Python成为处理办公自动化的强大工具。通过Python的自动化办公实现,可以让我们的办公变得简单、高效。 Python自动化办公的应用场景 Python自动化办公可以广泛应用于文档处理、Excel数据分析、PDF文件处理、邮件…

    python 2023年5月19日
    00
  • Python字符串的字符转换、字符串劈分、字符串合并问题分析

    下面来详细讲解一下Python字符串的字符转换、字符串劈分、字符串合并问题分析的完整攻略。 字符转换 在Python中,字符串是不可变的,但我们可以通过一些方法转换其中的字符。常见的字符转换方法有以下几种: ord()函数 ord()函数接收一个UTF-8字符,返回它对应的Unicode码(十进制整数)。 ch = ‘A’ print(ord(ch)) # …

    python 2023年5月14日
    00
  • Python批量提取PDF文件中文本的脚本

    下面是“Python批量提取PDF文件中文本的脚本”的完整攻略。 准备工作 安装依赖库 需要在Python环境下安装 pdfminer3k 库,其支持python2和python3。 可以使用 pip 命令在终端中安装: pip install pdfminer3k 下载脚本 从Github上 pdfminer-batch 下载脚本并解压,将所有 .py 文…

    python 2023年6月6日
    00
  • python字典中get()函数的基本用法实例

    下面我将为您详细讲解 Python 字典中 get() 函数的基本用法和实例。 什么是 Python 字典? 在了解 get() 函数前,我们先来了解一下 Python 字典。Python 字典是一种无序的、可变的、映射类型的数据结构,通常用于存储键值对. Python 字典由花括号 {}、表达式组成,表达式中每个元素都是一个键值对,键和值之间用冒号 : 分…

    python 2023年5月13日
    00
合作推广
合作推广
分享本页
返回顶部