标签

 pytorch 

相关的文章:

这是一个包含多篇关于PyTorch应用实例的列表页,涵盖了神经网络训练、模型优化以及AI生成等方面的内容。通过这些实例,您可以了解到如何使用PyTorch进行神经网络训练,优化模型,并实现AI生成。

谷歌裁掉整个 Python 团队!PyTorch 创始人急得直骂人:“WTF!核心语言团队无可替换”

原文约2800字,阅读约需7分钟。发表于:

谷歌 Python 工程师、Python 指导委员会成员 Thomas Wouters 昨天在社交媒体上发布了一条消息,称谷歌解散了 Python 团队。

谷歌解散了Python团队,但在慕尼黑组建新团队,负责维护稳定的Python版本和开发构建系统规则。谷歌一直是Python的支持者和用户,与Python软件基金会有密切关系。开发者认为这对AI时代的谷歌不合理。

谷歌裁掉整个 Python 团队!PyTorch 创始人急得直骂人:“WTF!核心语言团队无可替换”
相关推荐 去reddit讨论

用垃圾显卡训练pytorch搭建的神经网络,代码实战,pytorch+burn 实现A卡训练模型

原文英文,约900词,阅读约需4分钟。发表于:

前言 我在刚接触的pytorch的时候,只有一台破笔记本,学到CNN的时候,需要用显卡训练模型,那时的我,兜比脸干净,此生头一次感觉到贫穷限制了我对知识的追求。 再回首恍然如梦,尝试垃圾卡一样可以训模型,我命由我不由天。 我的思路是这样: 首先我们需要一个跨平台,支持多种显卡驱动的,统一的api框架。 然后还需要一个能够在这个api之上,训练任意模型的媒介 最后把我们的pytorch模型放在这个媒介上训练 1. wgpu wgpu框架,是一个跨平台、安全、纯 Rust 的图形 API。它可以运行在 Vulkan、Metal、D3D12 和 OpenGL ,以及 wasm 上的 WebGL2 和 WebGPU 之上。 它的API基于WebGPU 标准实现。 看一下它支持的平台: API Windows Linux/Android macOS/iOS Web (wasm) Vulkan ✅ ✅ 🌋 Metal ✅ DX12 ✅ OpenGL 🆗 (GL 3.3+) 🆗 (GL ES 3.0+) 📐 🆗 (WebGL2) WebGPU ✅ ✅ = 支持 🆗 = 低级支持 📐 = 需要ANGLE翻译层(仅限 GL ES 3.0) 🌋 = 需要MoltenVK翻译层 🛠️ = 不受支持,但欢迎贡献 可以看到他的跨平台,各种驱动的支持力度,都非常强,并且作为核心被应用在Firefox和Deno中,是我们的不二首选。 2. burn burn是一个使用 Rust 构建的全新综合动态深度学习框架, 以极高的灵活性、计算效率和可移植性为主要目标。 作为中间的媒介,burn有两个特点是我选择的理由 对各种设备的兼容,这是burn最独特的一点 对于移植性做的特别好,是作为媒介最基本的特性 当然,作为一个新兴起的框架,burn还有很多待改进的地方,比如对新算法的支持,对灵活数据结构的支持,不过就工程角度上讲,burn是满足大部分需要的。 代码实战 我们这里用手写数字识别的例子,演示如何用我们笔记本的显卡训练。 模型代码,我们这里就用torch官方的mnist的代码 看一下我电脑的显卡: Intel UHD Graphics 630 1536 MB,标准的垃圾卡 1. pytorch模型与导出 我这里简单贴一下模型: class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = nn.Conv2d(1, 8, 3) self.conv2 = nn.Conv2d(8, 16, 3) self.conv3 = nn.Conv2d(16, 24, 3) self.norm1 = nn.BatchNorm2d(24) self.dropout1 = nn.Dropout(0.3) self.fc1 = nn.Linear(24 * 22 * 22, 32) self.fc2 = nn.Linear(32, 10) self.norm2 = nn.BatchNorm1d(10) def forward(self, x): x = self.conv1(x) x = F.relu(x) x = self.conv2(x) x = F.relu(x) x = self.conv3(x) x = F.relu(x) x = self.norm1(x) x = torch.flatten(x, 1) x = self.fc1(x) x = F.relu(x) x = self.dropout1(x) x = self.fc2(x) x = self.norm2(x) output = F.log_softmax(x, dim=1) return output 1.1 state_dict方式导出 第一种方式:我们可以通过state_dict导出模型参数,如下代码,我们能导出mnist.pt的文件。 if args.save_model: torch.save(model.state_dict(), "mnist.pt") 然后在burn中,声明同样的模型: #[derive(Module, Debug)] pub struct Model<B: Backend> { conv1: Conv2d<B>, conv2: Conv2d<B>, conv3: Conv2d<B>, norm1: BatchNorm<B, 2>, fc1: Linear<B>, fc2: Linear<B>, norm2: BatchNorm<B, 0>, phantom: core::marker::PhantomData<B>, } ... pub fn forward(&self, input1: Tensor<B, 4>) -> Tensor<B, 2> { let conv1_out1 = self.conv1.forward(input1); let relu1_out1 = relu(conv1_out1); let conv2_out1 = self.conv2.forward(relu1_out1); let relu2_out1 = relu(conv2_out1); let conv3_out1 = self.conv3.forward(relu2_out1); let relu3_out1 = relu(conv3_out1); let norm1_out1 = self.norm1.forward(relu3_out1); let flatten1_out1 = norm1_out1.flatten(1, 3); let fc1_out1 = self.fc1.forward(flatten1_out1); let relu4_out1 = relu(fc1_out1); let fc2_out1 = self.fc2.forward(relu4_out1); let norm2_out1 = self.norm2.forward(fc2_out1); log_softmax(norm2_out1, 1) } 最后将mnist加载到我们的模型中来。 // 加载mnist.pt文件 let record = NamedMpkFileRecorder::<FullPrecisionSettings>::default() .load(Path::new(OUT_DIR).into(), &device) .expect("Failed to decode state"); // 创建模型,并把文件中的参数加载到模型里 let model: Model<Backend> = Model::init(&device).load_record(record); 这种方式,简直是脱裤子放p,xxxx 1.2 onnx 开放神经网络交换 上面的方式能够加载torch的模型,但是,简直是一坨s,我们肯定是不会用的。 思考:我们的目标是星辰大海,怎么能局限在torch上那,既然要做开发能力,那我们索性就做到底,直接对onnx模型进行训练 ONNX(Open Neural Network Exchange):是一套表示深度神经网络模型的开放格式,规范了 AI 模型交换标准,使 AI 模型可以在不同框架和环境下交互使用。 我们将pytorch中的模型,用如下代码,导出onnx格式。最终得到一个mnist.onnx文件。 if args.export_onnx: dummy_input = torch.randn(1, 1, 28, 28, device=device) torch.onnx.export(model, dummy_input, "mnist.onnx", verbose=True, opset_version=16) 根据这个文件,我们可以直接生成我们的模型 在rust项目中的build.rs中,构建mnist.onnx成为一个mnist.rs,构建包使用burn-import ModelGen::new() .input("./model/mnist.onnx") .out_dir("./model/") .run_from_script(); 注意: 在某些情况下,构建地址会有问题,比如workspace模式下,并不是构建在当前目录,然后你可能无法找到mnist.rs的地址。 解决方法: 把构建日志打印出来,命令cargo build -vv,如下图,可以看到文件的输出路径。 看一下自动构建的模型代码: #[derive(Module, Debug)] pub struct Model<B: Backend> { conv2d1: Conv2d<B>, conv2d2: Conv2d<B>, conv2d3: Conv2d<B>, batchnormalization1: BatchNorm<B, 2>, linear1: Linear<B>, linear2: Linear<B>, batchnormalization2: BatchNorm<B, 0>, phantom: core::marker::PhantomData<B>, } ... #[allow(clippy::let_and_return, clippy::approx_constant)] pub fn forward(&self, input1: Tensor<B, 4>) -> Tensor<B, 2> { let conv2d1_out1 = self.conv2d1.forward(input1); let relu1_out1 = burn::tensor::activation::relu(conv2d1_out1); let conv2d2_out1 = self.conv2d2.forward(relu1_out1); let relu2_out1 = burn::tensor::activation::relu(conv2d2_out1); let conv2d3_out1 = self.conv2d3.forward(relu2_out1); let relu3_out1 = burn::tensor::activation::relu(conv2d3_out1); let batchnormalization1_out1 = self.batchnormalization1.forward(relu3_out1); let flatten1_out1 = batchnormalization1_out1.flatten(1, 3); let linear1_out1 = self.linear1.forward(flatten1_out1); let relu4_out1 = burn::tensor::activation::relu(linear1_out1); let linear2_out1 = self.linear2.forward(relu4_out1); let batchnormalization2_out1 = self.batchnormalization2.forward(linear2_out1); let logsoftmax1_out1 = burn::tensor::activation::log_softmax(batchnormalization2_out1, 1); logsoftmax1_out1 } 当然,我们也可以直接构建到我们的二进制程序里, ModelGen::new() .input("./model/mnist.onnx") .out_dir("./model/") .record_type(RecordType::Bincode) //类型为bin .embed_states(true) .run_from_script(); 当这种情况下,我们无法用传统的mod xxx的方式引用模型,需要用如下代码,引入构建后的mnist.rs。 pub mod mnist { include!(concat!(env!("OUT_DIR"), "./model/mnist.rs")); } 2. 验证构建的模型 我们从pytorch导出的onnx模型,除了模型本身,还是具有参数的,实际在torch的例子中,导出的是一个训练好的卷积网络。 我们在自动构建之后,除了mnist.rs,还有mnist.bin和mnist.mpk,里面存放了模型参数等信息。 也就是说,我们可以直接将这个模型加载进来直接用。 加载模型: let model: Model<Backend> = Model::default(); 如上创建模型,会默认加载参数,如下代码,从./model/mnist目录中加载bin和mpk impl<B: Backend> Default for Model<B> { fn default() -> Self { Self :: from_file ("./model/mnist" , & Default :: default ()) } } 我们构建一个验证过程:指定一个mnist测试集中的一个图片,让这个模型来识别数字是多少? 代码传送门 用如下命令运行程序 cargo run -- 12 效果截图,可以看到能够精准预测。 3. 准备训练无参模型 上面验证了有参模型,通过构建是能够直接用的,但是,我们的目标是训练一个没调整过的模型。 3.1 实现数据加载 和torch的套路一样,burn同样需要构建dataset和dataloader,代码如下,我这里直接用了burn的MNISTDataset的数据集。主要功能就是数据加载 和 预处理。 #[derive(Clone)] pub struct ClassificationBatcher<B: Backend> { device: B::Device, } #[derive(Clone, Debug)] pub struct ClassificationBatch<B: Backend> { pub images: Tensor<B, 4>, pub targets: Tensor<B, 1, Int>, } impl<B: Backend> ClassificationBatcher<B> { pub fn new(device: B::Device) -> Self { Self { device, } } } impl<B: Backend> Batcher<MNISTItem, ClassificationBatch<B>> for ClassificationBatcher<B> { fn batch(&self, items: Vec<MNISTItem>) -> ClassificationBatch<B> { let targets = items .iter() .map(|item| { Tensor::<B, 1, Int>::from_data(Data::from([(item.label as i64).elem()]), &self.device) }) .collect(); let images = items .into_iter() .map(|item| { let image_data = item.image.iter().copied().flatten().collect::<Vec<f32>>(); let mut input: Tensor<B, 3> = Tensor::from_floats(image_data.as_slice(), &self.device).reshape([1, 28, 28]); // Normalize the input input = ((input / 255) - 0.1307) / 0.3081; input }) .collect(); let images = Tensor::stack(images, 0); let targets = Tensor::cat(targets, 0); ClassificationBatch { images, targets } } } 3.2 迭代和损失策略 我们这里使用经典的CrossEntropyLoss损失函数 优化器使用AdaGrad TrainStep是模型用于训练的trait,ValidStep是模型用于验证的trait,我们要为自动生成的Model,实现这两个trait,才能开始训练 impl<B: Backend> Model<B> { pub fn forward_classification( &self, images: Tensor<B, 4>, targets: Tensor<B, 1, Int>, ) -> ClassificationOutput<B> { let output = self.forward(images); let loss = CrossEntropyLossConfig::new() .init(&output.device()) .forward(output.clone(), targets.clone()); ClassificationOutput::new(loss, output, targets) } } impl<B: AutodiffBackend> TrainStep<ClassificationBatch<B>, ClassificationOutput<B>> for Model<B> { fn step(&self, batch: ClassificationBatch<B>) -> TrainOutput<ClassificationOutput<B>> { let item = self.forward_classification(batch.images, batch.targets); TrainOutput::new(self, item.loss.backward(), item) } } impl<B: Backend> ValidStep<ClassificationBatch<B>, ClassificationOutput<B>> for Model<B> { fn step(&self, batch: ClassificationBatch<B>) -> ClassificationOutput<B> { self.forward_classification(batch.images, batch.targets) } } 3.3 训练过程,和添加监控 下面是我们的整个训练过程,套路和torch一模一样 我们将训练用的配置,和最终的模型,保存到文件中 加入burn自带的监控,方便我们观察准确率和损失的变化。 我们这里用new方法加载默认参数的模型,也就是没训练过的模型,而不是default pub fn train<B: AutodiffBackend>(config: TrainingConfig, device: B::Device) { std::fs::create_dir_all(ARTIFACT_DIR).ok(); config .save(format!("{ARTIFACT_DIR}/config.json")) .expect("Config should be saved successfully"); B::seed(config.seed); let dataset_train = MNISTDataset::train(); let dataset_test = MNISTDataset::train(); // Dataloaders let batcher_train = ClassificationBatcher::<B>::new(device.clone()); let batcher_valid = ClassificationBatcher::<B::InnerBackend>::new(device.clone()); let dataloader_train = DataLoaderBuilder::new(batcher_train) .batch_size(config.batch_size) .shuffle(config.seed) .num_workers(config.num_workers) .build(dataset_train); let dataloader_test = DataLoaderBuilder::new(batcher_valid) .batch_size(config.batch_size) .num_workers(config.num_workers) .build(dataset_test); // Learner config let learner = LearnerBuilder::new(ARTIFACT_DIR) .metric_train_numeric(AccuracyMetric::new()) .metric_valid_numeric(AccuracyMetric::new()) .metric_train_numeric(LossMetric::new()) .metric_valid_numeric(LossMetric::new()) .with_file_checkpointer(CompactRecorder::new()) .devices(vec![device.clone()]) .num_epochs(config.num_epochs) .build( Model::new(&device.clone()), config.optimizer.init(), config.learning_rate, ); // Training let now = Instant::now(); let model_trained = learner.fit(dataloader_train, dataloader_test); let elapsed = now.elapsed().as_secs(); println!("Training completed in {}m{}s", (elapsed / 60), elapsed % 60); model_trained .save_file(format!("{ARTIFACT_DIR}/model"), &CompactRecorder::new()) .expect("Trained model should be saved successfully"); } 4. 开始训练 正式训练之前,需要配置一下训练相关的参数,将这个cfg传入train即可。 let mut cfg = TrainingConfig::new(AdaGradConfig::new()); cfg.num_workers = 4; cfg.num_epochs = 8; cfg.batch_size = 1000; cfg.learning_rate = 1.0; 4.1 CPU 我们先用cpu尝试一下: train::<Autodiff<NdArray>>(cfg, NdArrayDevice::Cpu); run起程序, 风扇开始呼呼转动,窗口直接黑屏卡死,cpu监控拉满: 4.2 GPU 接下来用我们的笔记本自带的垃圾卡跑一下(一般的a卡和i卡都可以跑) train::<Autodiff<Wgpu>>(cfg, WgpuDevice::default()); 看一下监控的变化: 预计用时37分分钟 准确率增加明显 再看一下损失变化情况,降低的也很好 看一下显卡的使用情况,a卡已经被利用起来了 最后看一下cpu的负载,有增加,但不多 4.3 libtorch 假如你很富有,有n卡,或者m1的mac,那么你同样可以用这种方式训练。 比如用m1芯片: train::<Autodiff<LibTorch>>(cfg,LibTorchDevice::Mps); 或者CUDA train::<Autodiff<LibTorch>>(cfg,LibTorchDevice::Cuda(0)); 我这里就不测试了 尾语 burn的能力不仅限于上面的种种,它允许自定义设备的接入。但是目前还处在较为初期的阶段,像我们pytorch例子中的nll_loss和Adadelta都是不支持的。 前几年挖矿,和最近的ai的尽头是电力和算力,都在大力拉升显卡的价格,国内显卡和好的芯片价格高得离谱,还要处处被卡脖子,哎~ 最后祝愿每个点赞收藏的帅哥美女都用上好卡。

本文介绍了使用pytorch和burn框架进行深度学习模型训练的方法,包括wgpu框架和burn框架的特点和支持平台,导出和加载模型的步骤,以及使用burn框架进行模型训练和验证的示例。

用垃圾显卡训练pytorch搭建的神经网络,代码实战,pytorch+burn 实现A卡训练模型
相关推荐 去reddit讨论

pyvene:通过干预理解和改进 PyTorch 模型的开源库

原文约400字,阅读约需1分钟。发表于:

通过在模型内部状态进行干预,我们介绍了一个开源的 Python 库 pyvene,它支持对不同的 PyTorch 模块进行可定制化的干预。该库提供了一个统一且可扩展的框架,可以在神经模型上执行干预操作,并与他人共享这些修改过的模型。我们通过因果抽象和知识定位的解释性分析展示了这个库的功能。

本研究提出了一种新的计算机视觉方法ViTree,用于细粒度视觉分类。该方法结合了流行的视觉转换器和神经决策树,通过选择补丁和路径来改进表示,并提高模型的可解释性。实验证明,ViTree在性能和可解释性方面超越了竞争对手。

相关推荐 去reddit讨论

使用PyTorch演示​​实现神经网络过程

原文英文,约1200词,阅读约需5分钟。发表于:

借助著名的开源PyTorch 框架,可以使用Python创建和训练神经网络。本教程将教您如何使用 PyTorch 创建基本神经网络并对 MNIST 数据集中的手写数字进行分类。现代人工智能依赖于神经网络,神经网络赋予机器类似于人类的学习和判断能力。回归、分类和创建只是神经网络(作为计算机模型)在从输入中学习后可能执行的一些任务。流行的开源 PyTorch 框架可用于用 Python 设计和训练神经网络。在本教程中,您将学习如何使用 PyTorch 使用基本神经网络对 MNIST 数据集中的手写数字进行分类。如何在 PyTorch 中创建神经网络?通过 nn.Module 类或 nn.Seque

本教程介绍了使用PyTorch框架创建和训练神经网络对手写数字进行分类的方法。通过nn.Module类或nn.Sequential容器构建网络,描述架构、指定损失函数和优化器,并进行训练和测试。展示了样本图像和预测结果。

相关推荐 去reddit讨论

PyTorch Official VSCode DevContainer

原文英文,约300词,阅读约需1分钟。发表于:

Build and Develop PyTorch with VSCode DevContainer

本文介绍了使用官方的PyTorch VSCode DevContainer构建和开发PyTorch的方法。作者指出,按照PyTorch GitHub存储库中的说明操作可以简单地构建官方的DevContainer,但需要在devcontainer.json文件中指定正确的CUDA版本。然而,使用官方的DevContainer构建PyTorch并不能解决编译器问题导致的分段错误或系统冻结。总的来说,官方的PyTorch VSCode DevContainer是构建和开发PyTorch的方便选择,但开发环境的透明度可能不高。

PyTorch Official VSCode DevContainer
相关推荐 去reddit讨论

基于 PyTorch 的符合性预测库 TorchCP

原文约400字,阅读约需1分钟。发表于:

TorchCP 是一个用于深度学习模型上的符合预测研究的 Python 工具箱,基于 PyTorch 构建,结合矩阵计算的优势提供了简洁高效的推断实现。

本文介绍了一种名为可信度预测编程 (CPP) 的方法,用于解决具有非线性约束函数和任意随机参数影响的机会约束优化问题 (CCO)。CPP利用随机参数的样本和量化引理,将CCO问题转化为确定性优化问题。CPP对CCO问题具有边际概率可行性保证,并可以轻松扩展以包含不同的可信度预测变体。

相关推荐 去reddit讨论

PyTorch Custom ONNX Operator Export

原文英文,约1600词,阅读约需6分钟。发表于:

Easier PyTorch to TensorRT Custom Plugin Integration

本文介绍了如何将PyTorch模块导出为ONNX自定义运算符,以便与TensorRT自定义插件集成。对于使用ONNX Opset 15或更高版本(ONNX IR >= 8)导出ONNX模型,可以使用torch.onnx.export函数中的export_modules_as_functions参数。对于使用ONNX Opset 14或更低版本(ONNX IR < 8)导出ONNX模型,需要实现一个PyTorch虚拟torch.autograd.Function,并将其注册为PyTorch自定义运算符。然后,将PyTorch模块的前向传递切换到PyTorch虚拟模块的前向传递。最后,使用TensorRT自定义插件、TensorRT引擎构建器和TensorRT引擎运行器验证导出的ONNX自定义运算符。

PyTorch Custom ONNX Operator Export
相关推荐 去reddit讨论

利用 S3 Connector for Pytorch 在训练代码中实现 S3 的流式读取

原文英文,约600词,阅读约需3分钟。发表于:

在最近的亚马逊云科技 re:Invent 大会上发布的新功能——Amazon S3 Connector for PyTorch 为我们提供了一种利用在 PyTorch 代码中直接流式读取 S3 文件的能力。本文将深入探讨 S3 Connector for PyTorch 的使用方法,旨在帮助用户快速理解并运用这一工具,以优化他们的模型训练流程。

本文介绍了使用Amazon S3 Connector for PyTorch从Amazon S3中流式读取数据的方法,简化训练代码,提高GPU利用率,降低存储成本。S3 Connector for PyTorch为PyTorch模型训练提供高效的数据加载接口。根据训练规模、数据集大小和代码可移植性,可以选择SageMaker FastFileMode、Mountpoint for S3或S3 Connector进行存储。

利用 S3 Connector for Pytorch 在训练代码中实现 S3 的流式读取
相关推荐 去reddit讨论

基于 PyTorch 的卷积神经网络的面部情绪识别

原文约400字,阅读约需1分钟。发表于:

基于 PyTorch 库的卷积神经网络模型,用于实时识别面部表情,通过优化网络以及调整超参数达到改善空间复杂度的目的,研究面部情绪识别的相关问题。

本文提出并实现了一个通用的卷积神经网络(CNN)构建框架,用于设计实时CNN。通过创建一个实时视觉系统来验证模型,在混合步骤中完成面部检测、性别分类和情感分类任务。准确性分别为96%和66%。介绍了最近的实时启用的引导反向传播可视化技术。通过在RoboCup@Home比赛中使用的Care-O-bot 3机器人上部署进行验证。

相关推荐 去reddit讨论

PyTorch 加速生成式 AI 第二部分:高速 GPT [译]

本篇博客是关于使用纯 PyTorch 加速生成式 AI 模型的系列文章的第二部分,由 PyTorch 团队撰写。我们在这里分享了 PyTorch 的最新性能特性,并通过实际案例,展示了如何最大限度地提升 PyTorch 的性能。在系列的第一篇文章中,我们演示了如何仅用 PyTorch 将“Segment Anything”加速超过 8 倍。本文将聚焦于大语言模型(LLM)的优化技术。

相关推荐 去reddit讨论