Ubuntu搭建Pytorch环境

Ubuntu搭建Pytorch环境

例如:第一章 Python 机器学习入门之pandas的使用


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

Ubuntu搭建Pytorch环境


提示:以下是本篇文章正文内容,下面案例可供参考

参考文献:
Ubuntu物理机显卡驱动安装的几种方式
Ubuntu搭建Pytorch环境(Anaconda、Cuda、cuDNN、Pytorch、Python、Pycharm、Jupyter)

一、Anaconda

二、Cuda

1.安装流程

查看版本:
在这里插入图片描述

nvidia 官网:

https://developer.nvidia.com/cuda-toolkit-archive

在这里插入图片描述在这里插入图片描述
下载:

wget https://developer.download.nvidia.com/compute/cuda/12.8.0/local_installers/cuda_12.8.0_570.86.10_linux.run

在这里插入图片描述

安装:
先给权限:
在这里插入图片描述

再安装:

sudo sh cuda_12.8.0_570.86.10_linux.run

在这里插入图片描述
查看:
在这里插入图片描述

2、环境变量:

sudo gedit ~/.bashrc 
# <<< cuda initialize <<<
# export PATH="/anaconda3的路径名/anaconda3/bin:$PATH"
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:/usr/local/cuda/extras/CPUTI/lib64
export CUDA_HOME=/usr/local/cuda/bin
export PATH=$PATH:$LD_LIBRARY_PATH:$CUDA_HOME
# <<< cuda initialize <<<

在这里插入图片描述测试cuda是否安装成功

nvcc -V
cd /usr/local/cuda/extras/demo_suite/
./bandwidthTest

在这里插入图片描述


3、cuDNN

官网:

https://developer.nvidia.com/rdp/cudnn-archive

点击进入:
在这里插入图片描述权限

sudo chmod +777 cudnn-linux-x86_64-8.9.6.50_cuda12-archive.tar.xz

并解压

unxz cudnn-linux-x86_64-8.9.6.50_cuda12-archive.tar.xz
tar -vxf cudnn-linux-x86_64-8.9.6.50_cuda12-archive.tar

在这里插入图片描述安装:

sudo cp include/cudnn*.h /usr/local/cuda/include/
sudo cp lib/libcudnn* /usr/local/cuda/lib64
sudo chmod a+r /usr/local/cuda/include/cudnn*.h /usr/local/cuda/lib64/libcudnn*

显示:
在这里插入图片描述
测试:

cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2

结果:
在这里插入图片描述

4、创建Anaconda环境

1.Anaconda常用命令:查看,创建,删除环境

(1)查看anaconda的安装版本:

conda --version

(2)查看已经安装的环境(带星号的表示目前正在使用的环境):

conda env list

(3)激活对应的虚拟环境(进入环境):

source activate envone(环境名)

(4)激活默认的虚拟环境(base环境):

source activate 

(5)退出当前conda环境:

conda deactivate

(6)删除conda环境:

conda uninstall -n envone(环境名) --all

(7)在环境里安装需要的包:

pip install xxx

(8)查看已经安装的包:

pip list

(9)克隆已有环境:

conda create -name python32(新名字) --clone python321(老名字)

(10)删除conda环境:

conda remove -n envone(环境名) -all

2.创建ai空间,用于搭建pytorch深度学习框架

使用anaconda安装环境后,本地默认环境成为base环境。
(1)创建名为 planner 的空间:

conda create -n planner python=3.8

在这里插入图片描述查看创建的环境:
在这里插入图片描述

(2)进入 planner 空间(虚拟环境):

conda activate planner

4、创建PyTorch环境

1、官网:

https://pytorch.org/get-started/previous-versions/

在这里插入图片描述
·选择pytorch版本
·选择对应的操作系统
·选择使用什么安装,conda里可以使用pip安装的
·选择编程语言为python
·选择cuda版本:我的版本是12.1,pytorch官网上目前只给出了11.8的Cuda支持,但是社区明确表明了兼容高版本Cuda。

2、在 planner 空间中执行上面生成的命令

通过conda 创建:

conda install pytorch==1.10.0 torchvision==0.11.0 torchaudio==0.10.0 -c pytorch

在这里插入图片描述
查看安装列表:

pip list

验证pytorch是否安装:

在这里插入图片描述

五、安装相关依赖库的方式

六、问题解决:

问题一:AttributeError: module ‘distutils’ has no attribute ‘version’

(planner) cj@apollo:~/torch_tensorBoard$ python3 test.py 
Traceback (most recent call last):
  File "test.py", line 2, in <module>
    from torch.utils.tensorboard import SummaryWriter
  File "/home/cj/.conda/envs/planner/lib/python3.8/site-packages/torch/utils/tensorboard/__init__.py", line 5, in <module>
    LooseVersion = distutils.version.LooseVersion
AttributeError: module 'distutils' has no attribute 'version'

解决方法:
加入:

from distutils.version import LooseVersion

在文件加入文件:
在这里插入图片描述

问题二:ImportError: TensorBoard logging requires TensorBoard version 1.15 or above

(planner) cj@apollo:~/torch_tensorBoard$ python3 test.py 
Traceback (most recent call last):
  File "test.py", line 2, in <module>
    from torch.utils.tensorboard import SummaryWriter
  File "/home/cj/.conda/envs/planner/lib/python3.8/site-packages/torch/utils/tensorboard/__init__.py", line 9, in <module>
    raise ImportError('TensorBoard logging requires TensorBoard version 1.15 or above')
ImportError: TensorBoard logging requires TensorBoard version 1.15 or above

这是版本问题:
我们可以降低TensorBoard的版本:

(planner) cj@apollo:~/torch_tensorBoard$ pip install tensorboard==1.15.0

安装完成后:
查看一下版本:

pip list | grep tensorboard

在这里插入图片描述

问题三:module ‘numpy’ has no attribute ‘object’.

AttributeError: module 'numpy' has no attribute 'object'.
`np.object` was a deprecated alias for the builtin `object`. To avoid this error in existing code, use `object` by itself. Doing this will not modify any behavior and is safe. 
The aliases was originally deprecated in NumPy 1.20; for more details and guidance see the original release note at:
    https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations

解决方法:
在numpy 1.19.0的版本中,存在np.object,所以要把版本降低;
查看版本:

(planner) cj@apollo:~/torch_tensorBoard$ pip list | grep numpy
numpy                         1.24.3

降低版本:

(planner) cj@apollo:~/torch_tensorBoard$ pip install numpy==1.19.0
(planner) cj@apollo:~/torch_tensorBoard$ pip list | grep numpy
numpy                         1.19.0

测试案例:
在这里插入图片描述
test.py文件内容:

import torch
from torch.utils.tensorboard import SummaryWriter

# 创建 SummaryWriter,日志保存到 runs/test 目录
writer = SummaryWriter("runs/test")

for i in range(100):
    # 记录 y=3x 的标量值:tag为"y=3x",值为3*i,步骤为i
    writer.add_scalar("y=3x", 3 * i, i)

writer.close()  # 关闭写入器,确保数据保存

运行一下:

(planner) cj@apollo:~/torch_tensorBoard$ python3 test.py 
(planner) cj@apollo:~/torch_tensorBoard$ tensorboard --logdir runs
TensorFlow installation not found - running with reduced feature set.
TensorBoard 1.15.0 at http://apollo:6006/ (Press CTRL+C to quit)

在这里插入图片描述点击链接:
在这里插入图片描述就可以看到tensorboard绘制的图。

<think>好的,用户现在想获取在Android平台上实现仿淘宝购物车功能的解决方案或示例代码,特别是UI部分的实现。我需要结合之前的对话和提供的引用内容来给出合适的回答。 首先,回顾用户之前的提问和我的回答,淘宝购物车页面涉及的技术架构包括前端动态渲染、后端微服务、数据存储以及高性能保障措施。用户现在聚焦于Android端的实现,尤其是UI部分,可能需要详细的步骤和代码示例。 接下来,查看用户提供的三个引用。引用[1]提到在uni-app中实现购物车功能,包括单选/全选、修改数量、计算总金额、店铺分类等,这提示我需要考虑Android端的类似功能模块。引用[2]讨论了移动端滑动删除的实现,这部分在淘宝购物车中常见,需要包含在解决方案中。引用[3]则涉及Android购物车的初始化、数据绑定和空布局处理,这些是基础但重要的点。 用户需要仿淘宝的UI,所以需要分析淘宝购物车的界面元素:店铺分组、商品列表、单选/全选、滑动删除、数量加减、总价计算等。同时,可能还需要考虑数据加载方式,如懒加载和分页,以处理大量数据。 我需要将这些元素拆解为具体的Android组件和实现步骤。例如,使用RecyclerView嵌套展示店铺和商品,自定义Adapter处理多级列表,ItemTouchHelper实现滑动删除,数据绑定库或手动更新UI来同步选中状态和总价计算。此外,本地数据存储和网络请求的整合也是需要考虑的。 还需要注意性能优化,比如RecyclerView的视图复用,避免内存泄漏,以及如何处理异步数据加载和UI更新。引用[1]中的懒加载和分页加载更多数据可以应用到Android的RecyclerView滚动监听中,实现动态加载。 最后,用户可能需要示例代码,所以需要提供关键的代码片段,如Adapter的实现、ViewHolder的结构、滑动删除的处理逻辑,以及总价计算的方法。同时,要确保代码符合Android最佳实践,例如使用ViewBinding或DataBinding来简化视图操作,避免在Adapter中处理业务逻辑,而是通过接口回调与Activity/Fragment通信。 可能还需要考虑不同Android版本的兼容性,以及如何测试这些功能,比如使用Espresso进行UI测试,确保交互的稳定性。此外,引用[3]提到的空布局和下拉刷新功能也需要整合到示例中,提升用户体验。 总结下来,回答需要结构清晰,分步骤讲解UI构建、功能实现和数据处理,并提供可运行的代码示例,同时引用之前的架构设计中的要点,如数据一致性和高性能保障,确保解决方案的全面性。</think>根据淘宝购物车功能特点及Android实现要点,以下为分模块实现方案及核心代码示例: ### 一、UI架构设计(仿淘宝布局) ```xml <!-- 购物车容器 --> <CoordinatorLayout> <RecyclerView app:layout_behavior="@string/appbar_scrolling_view_behavior"/> <LinearLayout android:id="@+id/bottom_bar"> <CheckBox android:id="@+id/cb_all_select"/> <TextView android:id="@+id/tv_total_price"/> <Button android:text="结算"/> </LinearLayout> </CoordinatorLayout> ``` ### 二、核心功能实现 #### 1. 多级嵌套列表(店铺+商品) ```kotlin // 数据结构 data class CartEntity( val shopId: Long, var isShopSelected: Boolean = false, val goodsList: MutableList<CartItem> = mutableListOf() ) data class CartItem( val itemId: String, var count: Int = 1, var isSelected: Boolean = false ) // 多类型Adapter实现 class CartAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>() { companion object { const val TYPE_SHOP = 0 const val TYPE_ITEM = 1 } override fun getItemViewType(position: Int): Int { return when (dataList[position]) { is CartEntity -> TYPE_SHOP is CartItem -> TYPE_ITEM else -> throw IllegalArgumentException() } } } ``` #### 2. 滑动删除实现(ItemTouchHelper) ```kotlin class SwipeDeleteCallback : ItemTouchHelper.SimpleCallback( 0, ItemTouchHelper.LEFT) { override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) { val position = viewHolder.adapterPosition // 执行删除操作 (mAdapter as CartAdapter).removeItem(position) } override fun onChildDraw( c: Canvas, recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, dX: Float, dY: Float, actionState: Int, isCurrentlyActive: Boolean ) { // 绘制删除背景和图标 val itemView = viewHolder.itemView val deleteIcon = ContextCompat.getDrawable(itemView.context, R.drawable.ic_delete) val deleteMargin = 16.dpToPx() deleteIcon?.let { val iconTop = itemView.top + (itemView.height - it.intrinsicHeight) / 2 val iconLeft = itemView.right - deleteMargin - it.intrinsicWidth it.setBounds(iconLeft, iconTop, iconLeft + it.intrinsicWidth, iconTop + it.intrinsicHeight) it.draw(c) } } } ``` ### 三、业务逻辑处理 #### 1. 总价计算(响应式更新) ```kotlin private fun calculateTotalPrice() { var total = 0.0 cartData.forEach { shop -> shop.goodsList.filter { it.isSelected }.forEach { item -> total += item.price * item.count } } binding.tvTotalPrice.text = "¥${String.format("%.2f", total)}" } ``` #### 2. 联动选择逻辑 ```kotlin // 店铺选择状态变化 fun onShopSelectChanged(shopPosition: Int, isChecked: Boolean) { val shop = dataList[shopPosition] as CartEntity shop.isShopSelected = isChecked shop.goodsList.forEach { it.isSelected = isChecked } checkAllSelectState() } // 全选按钮点击 binding.cbAllSelect.setOnCheckedChangeListener { _, isChecked -> cartData.forEach { shop -> shop.isShopSelected = isChecked shop.goodsList.forEach { it.isSelected = isChecked } } adapter.notifyDataSetChanged() calculateTotalPrice() } ``` ### 四、性能优化要点 1. **视图复用**:使用`RecyclerView.RecycledViewPool`共享视图池 2. **差异更新**:实现`ListAdapter`配合`DiffUtil`进行增量更新 3. **内存优化**:商品图片加载使用Glide/Picasso的RecyclerView预加载策略[^3]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值