(景行锐创) 高性能计算平台 Pytorch 深度学习环境超详细教程

news2024/11/27 16:42:51

文章目录

      • 前言
      • 1. 账号申请
      • 2. 登录高算平台网站
      • 3. 安装 Xshell,Xftp 软件
      • 4. 连接高算平台
      • 5. 安装 Anaconda
      • 6. 安装 CUDA
      • 7. 配置 cuDNN
      • 8. 安装 torch 和 torchvision
      • 9. 提交作业测试
      • 10. 解压与压缩文件
      • 11. 其他
      • 结语

前言

目前一些学校为了便于师生进行大规模的计算任务,构建了服务器集群,尽管学校一般都会进行培训和给出操作手册,但往往对于具体的任务缺乏详细地操作流程说明和具体解释。为了方便大家使用 (景行锐创) 高性能计算平台来开展研究,特别是基于 Pytorch 的深度学习任务,我结合自己多次失败的教训和成果的经验总结了这篇完整的高性能计算平台 Pytorch 深度学习环境超详细教程,希望该教程能够为大家提供参考。码字不易,还望三连支持。

1. 账号申请

默认已经申请到高算平台账号,不同学校对于账号的申请可能方式不同,具体可以自行咨询相关部门。

2. 登录高算平台网站

2.1 登录学校的高算平台登录网站。 注意:在校外的话一定要登录 vpn 才可以使用高算平台。
在这里插入图片描述
2.2 但在这里没法方便安装软件和环境,因此我在本地电脑下载 Xshell 和 Xftp 两个工具,前者主要用来进行远程交互式操作 (黑窗口),后者主要用来传文件。

3. 安装 Xshell,Xftp 软件

3.1 网址:https://www.xshell.com/zh/all-downloads/。

在这里插入图片描述
3.2 点击 Xshell, 选择 免费授权页面
在这里插入图片描述
3.3 填写自己的姓名和校园邮箱,选择 两者,点击下载后会在校园邮箱里发来一个下载链接,打开链接地址下载即可。
在这里插入图片描述
3.4 如果觉得以上操作麻烦,也可以直接使用以下链接下载:
Xshell:https://www.xshell.com/zh/downloading/?token=dTQyZl96em9ENHl0bTIzaVdDSkhXd0Biell6LVNGaUE5WHJtaWhrRVhTNENR
Xftp:https://www.xshell.com/zh/downloading/?token=TmFYTFlJQ1JSM3JGZEJMMlNoUTF3d0Biell6LVNGaUE5WHJtaWhrRVhTNENR
3.5 安装过程很简单,注意更换 安装路径

4. 连接高算平台

4.1 打开 Xshell。
在这里插入图片描述
4.2 输入 ssh 10.33.0.102 ,在弹出的窗口里输入 学号,注意这里的远程连接路径可能不同学校存在区别,需要自行咨询或查询手册。

4.3 点击确定,在弹出的窗口里选择 password,填入自己的登录密码。
在这里插入图片描述
4.4 点击确定后,输出 connection established 表明连接成功。
在这里插入图片描述
4.5 点击菜单栏里的 Xftp 按钮,就可以直接打开 Xftp 并连上个人登录节点。
在这里插入图片描述
4.6 如图所示,左边的是本地文件夹,右边的是个人登录节点文件夹;在 Xftp 里直接通过拖拽或者双击就可以拷贝文件到登录节点。
在这里插入图片描述
4.7 新注册高算平台在登录节点只有一个 jhupload 文件夹,为了方便后续工作,可以新建文件夹 software,project 和 dataset,分别用来安装软件,存放项目以及暂存数据集,所有上传的压缩包等文件全部放到 jhupload 文件夹。

5. 安装 Anaconda

5.1 由于高算平台的登录节点无法无法访问校园以外的网,所有的软件和包只能离线安装,因此需要提前本地下载好。

5.2 在 Anaconda 的国内镜像源下载,注意软件版本 Anaconda3 和操作系统 Linux_x86_64, 清华源:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/。
在这里插入图片描述
5.3 利用 Xftp 将下载的离线安装包拷贝到登录节点的 jhupload 文件夹下。

5.4 在已连接登录节点的 Xshell 中可以看到当前所在路径是 ~,这个就是家目录;输入 cd jhupload 进入离线安装包所在路径 (这个与 windows 一致,cd 是进入目录,cd … 是返回上一级目录)。
在这里插入图片描述
5.5 输入 sh Anaconda3-2021.05-Linux-x86_64.sh 运行安装脚本,后边这个是下载的离线安装包的全名,根据个人实际下载情况可能存在差异;点击回车键继续安装。
在这里插入图片描述
5.6 下面会显示阅读协议,长按回车键到最后。
在这里插入图片描述
5.7 输入 yes 接受协议。
在这里插入图片描述
5.8 修改 Anaconda 的安装路径在之前新建的文件夹 software 下,注意这里需要输入完整路径,不知道完整路径的可以在 Xftp 的路径栏里复制。
在这里插入图片描述
5.9 在复制的路径后添加 /anaconda3,这里不需要手动新建目录,会自动新建,如果已经存在该目录会安装失败;回车后就是漫长的等待。
在这里插入图片描述
5.10 安装好后会询问是不是在启动终端的时候就在 conda 环境里(类似 windows 下安装后的 Anaconda Prompt),输入 yes。
在这里插入图片描述
5.11 安装完成,这里让你安装 Pycharm,但由于我们没有图像界面就没必要装。
在这里插入图片描述
5.12 接下来配置环境变量,输入 vim ~/.bashrc,打开配置文件,需要先点击键盘上的 insert 键才能开始编辑;添加环境变量,键入 export PATH="/data/users/CHDHPC/2022024024/software/anaconda3/bin:$PATH",注意路径是完整路径。
在这里插入图片描述
5.13 点击 Esc (键盘上的返回键),输入 :x 退出配置文件,在 Xshell 中输入 source ~/.bashrc 更新配置文件;此时就会进入 Anaconda 的 base 环境,根据 Anaconda 版本的不同,有的会显示为 root。
在这里插入图片描述
5.14 输入 conda -V 判断 conda 命令能不能使用,正常会输出 conda 版本。
在这里插入图片描述

6. 安装 CUDA

6.1 这里我安装的是 cuda 11.1,高算平台支持 cuda 9, 10, 11 各版本,但实测发现低版本会报错,原因不明;下载 cuda 离线安装包时要注意对应系统内核,在 Xshell 中输入cat /proc/version,输出显示 Linux x86_64; cat /etc/redhat-release,输出显示 CentOS 7 版本。
在这里插入图片描述
6.2 下载 cuda 的离线安装包,网址:https://developer.nvidia.com/cuda-toolkit-archive,选择 CUDA Tookit 11.1.0
在这里插入图片描述
6.3 在新界面中选择 Linux_x86_64_CentOS_7_runfile (local)
在这里插入图片描述
6.4 此时下拉界面在 bash installer 框里会出现安装该 cuda 需要的命令,但由于登录节点无法访问校园以外的网,因此拷贝链接到浏览器搜索栏回车,稍等就会开始下载。
在这里插入图片描述
6.5 同理,将下载好的 cuda 离线安装包利用 Xftp 拷贝到 jhupload 文件夹里;在 Xshell 中进入 jhupload 目录,输入 sh cuda_11.1.0_455.23.05_linux.run 注意: 后边的 cuda 离线安装包全名根据个人实际下载情况修改。
在这里插入图片描述
6.6 此时可能会报一个错,log file not open,这是因为这台服务器上别人安装过 cuda,需要删掉 cuda-installer.log 文件,但在登录节点没有权限删除,在高算交流群里@管理员帮忙删除即可。
在这里插入图片描述
6.7 删除之后,继续 sh cuda_11.1.0_455.23.05_linux.run,开始安装,输入 accept。
在这里插入图片描述
6.8 取消勾选 Driver,这是因为服务器已经存在 NVIDIA 驱动,不需要安装;同时取消勾选 CUDA Demo Suite 和 CUDA Documentation; 注意:上下键移动光标,回车勾选或取消勾选。
在这里插入图片描述
6.9 移动光标到 Options,回车后选择 CUDA Toolkit,选择第一项 Chang Toolkit Install Path,这里先提前在家目录的 software 文件夹里新建一个文件夹,起名 cuda11.1,将安装路径改为 /data/users/CHDHPC/2022024024/software/cuda11.1,即 文件夹 cuda11.1 所在的完整路径。
在这里插入图片描述
6.10 回车后取消所有已勾选的项目;选择 done 回车。
在这里插入图片描述
6.11 再修改 Samples 的安装路径,在之前的 cuda11.1 文件夹下新建文件夹 samples,将安装路径改为 samples 所在的完整路径,/data/users/CHDHPC/2022024024/software/cuda11.1/samples
在这里插入图片描述
6.12 再修改 Library 安装路径,在之前的 cuda11.1 文件夹下新建文件夹 myLib,将安装路径改为 samples 所在的完整路径,/data/users/CHDHPC/2022024024/software/cuda11.1/myLib;这个其实什么也不会装,但以防万一还是把目录改一下。
在这里插入图片描述
6.13 回车选择 done ,选择 install 开始安装。
在这里插入图片描述
6.14 安装结束后的输出如图,可以看到已经成功安装 CUDA Toolkit。
在这里插入图片描述
6.15 接下来需要配置环境变量,在 Xshell 中输入 vim ~/.bashrc 打开配置文件,点击键盘上的 insert 键在之前添加的 Anaconda 环境变量后再添加 export PATH="/data/users/CHDHPC/2022024024/software/cuda11.1/bin:$PATH"export LD_LIBRARY_PATH="/data/users/CHDHPC/2022024024/software/cuda11.1/lib64:$LD_LIBRARY_PATH";点击键盘上的 Esc 键,输入 :x 退出编辑;再输入 source ~/.bashrc 更新配置文件。
在这里插入图片描述
6.16 利用 nvcc 检查 cuda 是否安装好,输入 nvcc -V 查看 cuda 版本,正常会输出当前 cuda 的版本。
在这里插入图片描述

7. 配置 cuDNN

7.1 下载 cudnn 离线包,网址:https://developer.nvidia.com/rdp/cudnn-archive,新用户需要注册,注册好后登录打开网址选择对应版本的 cudnn。
在这里插入图片描述
7.2 下载完成后,利用 Xftp 将下载的 cudnn 离线包拷贝到 jhupload 文件夹下,在 Xshell 下进入 jhupload 目录,输入 tar -xzvf cudnn-11.1-linux-x64-v8.0.5.39.tgz 解压 cudnn 压缩包。

7.3 利用以下两条命令拷贝 cudnn 里的文件到 cuda 的安装路径里: 注意:具体路径要根据实际情况修改。

cp /data/users/CHDHPC/2022024024/jhupload/cuda/include/* /data/users/CHDHPC/2022024024/software/cuda11.1/include/
cp /data/users/CHDHPC/2022024024/jhupload/cuda/lib64/* /data/users/CHDHPC/2022024024/software/cuda11.1/lib64/

7.4 查看 cudnn 版本,输入 cat /data/users/CHDHPC/2022024024/software/cuda11.1/include/cudnn_version.h | grep CUDNN_MAJOR -A 2,正常会输出当前的 cudnn 版本,如图说明当前的 cudnn 版本是 8.0.5。
在这里插入图片描述

8. 安装 torch 和 torchvision

8.1 这里我们直接将 pytorch 装在 base 下,首先查看 python 版本,输入 python -V,可以看到我安装的 Anaconda 自带的 base 环境下 python 版本为 3.8.8;直接装在 base 下的原因是 base 本身存在大量基础包,不需要额外安装,否则就要一个个单独安装,异常麻烦。
在这里插入图片描述
8.2 安装 Pytorch 1.9.0,官网:https://download.pytorch.org/whl/torch_stable.html,清华源:https://pypi.tuna.tsinghua.edu.cn/simple/torch/;下载对应 cuda11.1,python3.8.8 和 Linux_x86_64 的离线包 .whl。注意:建议官网安装,清华源安装遇到过报错的情况 (不一定会报错)。
在这里插入图片描述
8.3 Pytorch 1.9.0 对应的 torchvision 版本是 0.10.0, 如果是官网下载的话继续下拉找到对应 cuda11.1,python3.8.8 和 Linux_x86_64 的离线包 .whl;清华源下载的话需要进入新的网页:https://pypi.tuna.tsinghua.edu.cn/simple/torchvision/。
在这里插入图片描述
8.4 将下载好的 torch 和 torchvision 的两个 .whl 文件利用 Xftp 拷贝到 jhupload 文件夹下;在 Xshell 中进入 jhupload 目录,在 base 环境下使用 pip install torch-1.9.0+cu111-cp38-cp38-linux_x86_64.whlpip install torchvision-0.10.0+cu111-cp38-cp38-linux_x86_64.whl 分别安装; 注意:先装 torch 再装 torchvision。
在这里插入图片描述
8.5 安装好后,输入 pyhon 进入交互式环境,输入import torch 查看是否能正常导入 torch,可以输入 print(torch.cuda.is_available()) 查看 cuda 是否可以用,正常会输出 False;这是因为登录节点并未分配 NVIDIA 显卡,只有提交作业后才会根据提交的设置进行分配。
在这里插入图片描述
8.6 到这里,整个 pytorch 的环境已经配好;一些特殊的包还是需要单独下载安装的,清华源:https://pypi.tuna.tsinghua.edu.cn/simple/;需要什么包,一般在网址后边添加包名搜索即可。

9. 提交作业测试

9.1 准备一个 test.py 文件,功能是检查 cuda 是否可用,可以使用的 gpu 数量,当前的 cuda 版本以及当前节点上的GPU占用情况; 注意 这个测试代码是后边提交作业时会经常用到。

#!/data/users/CHDHPC/2022024024/software/anaconda3/bin/python3
import torch
print(torch.cuda.is_available()) # 检查 cuda 是否可用
print(torch.cuda.device_count()) # 检查可用的 gpu 数量
print(torch.version.cuda) # 查看 cuda 版本

# 下边的代码就是返回服务器上 GPU 的占用情况,这样方便我们选择 GPU 或者节点
import subprocess
ret = subprocess.run('nvidia-smi', shell=True, capture_output=True, timeout=100)
print(ret.stdout.decode('utf8'))

9.2 如果是在 windows 下编辑 test.py 需要将编码格式转为 Unix,这是因为 Windows 和 Linux 操作系统下的回车和换行符存在差异;在 NotePad++ 里可以在右下角操作,其他软件方法不明。
在这里插入图片描述
9.3 将该 python 文件放入家目录的 project 文件夹下,右键选择更改权限,将所有权限都给 test.py;如果不授权的话会报错:/apps/jhinno/unischeduler/jobstarter/qgpu_starter: line 8: ./test.py: Permission denied
在这里插入图片描述
9.4 在 Xshell 中进入 project 目录,使用 jsub -q qgpu -m gpu05x8 -e ./error.txt -o ./output.txt -J ceshi ./test.py 提交作业;具体的参数定义如下:

jsub 提交作业命令

-q 指定队列,pytorch 代码一般指定 qgpu 队列

-m 指定代码运行节点

-e 指定错误日志的输出文件,会在文件里写入运行中遇到的错误

-o 指定输出日志的输出文件,会在文件里写入代码的过程输出

-J 为当前提交的作业指定一个名字,一般一次只提交一个作业的话就不用管这个,比如上边的指令就是将作业命名为 ceshi

./test.py 就是前边的测试代码 python 文件

9.5 上述参数中 -q-m 需要自己查阅手册来确定队列和节点,不同的学校可能有不同的标识。
9.6 提交之后在 Xshell 中会输出作业已被提交。
在这里插入图片描述
9.7 这时我们可以登录网页版的高算平台,进入我的作业就可以看到提交的作业;状态为 DONE 即程序正常结束,作业名为 ceshi。
在这里插入图片描述
9.8 也可以不登录网页版的高算平台,直接在 Xshell 中输入 jjobs 或者 jjobs 作业号 来查看作业状态;前者是查看当前正在运行或排队的所有作业,后者是查看指定作业号的作业状态。
在这里插入图片描述
9.9 此时在 test.py 同目录下会出现 error.txt 和 output.txt 文件;打开 error.txt 发现为空,则没有错误输出;打开 output.txt 下拉到最后可以发现输出为 True,7 和 11.1,这说明 pytorch 可以检测到 cuda,当前可以检测到的 gpu 数量为 7, 当前 cuda 版本为 11.1;下拉还会有 GPU 占用情况的输出,可以方便我们后续将作业提交到空闲比较多的 GPU 上去。
在这里插入图片描述
9.10 在正式提交后续的作业时,我不建议使用前边这种命令行指定参数的方式提交。除了测试例子中提交作业的方式,还可以使用脚本方式提交作业;即新建一个 test.sh 文件,内容如下,参数的解释见 9.4 节;倒数第二行为 python 解释器的完整路径;最后一行为要运行的 python 文件路径,这个可以使用相对路径,但前提是在 Xshell 进入当前脚本所在文件夹;设置完成后,进入路径使用 jsub < ./test.sh 提交作业。

#!/bin/sh
#JSUB -q qgpu
#JSUB -m gpu04ai
#JSUB -e error.txt
#JSUB -o output.txt
#JSUB -J ceshi
/data/users/CHDHPC/2022024024/software/anaconda3/bin/python3 
./test.py

10. 解压与压缩文件

10.1 如果需要被解压或者压缩的文件大小小于 4G,那么我们可以直接使用平台自带的 unzip 或者 zip 命令来实现,注意这并不是说可以直接在 Xshell 中解压,我们仍然需要以作业的形式提交到高算平台来实现。
10.2 解压文件的脚本 unzip.sh 如下所示,注意要对路径进行修改,建议将该脚本文件直接放在与 .zip 文件同目录下。

#!/bin/bash
#JSUB -q normal
#JSUB -e error.txt
#JSUB -o output.txt
#JSUB -J unzip
unzip 'train.zip'

10.3 压缩文件的脚本 zip.sh 如下所示,注意要对路径进行修改,建议将该脚本文件直接放在与 .result 文件夹同目录下。

#!/bin/bash
#JSUB -q normal
#JSUB -e error.txt
#JSUB -o output.txt
#JSUB -J zip
zip -r result.zip ./result

10.4 对于文件大小大于 4G 的情况,就无法使用这个简单的工具了,我们必须安装其他的工具。Linux 下的解压工具很多,这里以安装 7zip 为例,可以用来解压 .zip 格式压缩包;下载 7zip 安装包,网址:https://sourceforge.net/projects/p7zip/;点击 Download 下载最新版。
在这里插入图片描述

10.5 将下载好的 7zip 安装包利用 Xftp 拷贝到 jhupload 文件夹下;在 Xshell 中进入 jhupload 目录,输入 tar -jxvf p7zip_16.02_src_all.tar.bz2 解压安装包; 注意: 7zip 安装包的全名要和自己下载的对应。

10.6 解压完成后,cd p7zip_16.02 进入解压得到的文件夹目录, 输入 make all3

10.7 make 结束后,在 Xftp 里用记事本打开 p7zip_16.02 路径下的 makefile.common 文件,修改 DEST_HOME 的路径为自己计划安装 7zip 的路径 /data/users/CHDHPC/2022024024/software/7zip 注意 将路径修改成自己对应的。

10.8 修改完成后,make install

10.9 报错:服务器时钟不对;在 Xftp 里根据文件的修改时间也可以判断确实服务器的时钟不对。
在这里插入图片描述
10.10 顺序执行:

find . -type f | xargs -n 5 touch
make clean	
make
make install

10.11 修改环境变量;Xshell 输入 vim ~/.bashrc 打开配置文件,在之前添加的 Anaconda 和 cuda 环境变量后边再添加 7zip 的环境变量, 注意 修改路径为自己对应的;完成后点击键盘上的 Esc,再输入 :x 退出编辑。

export PATH="/data/users/CHDHPC/2022024024/software/7zip/bin:$PATH"

10.12 输入 source ~/.bashrc 更新配置文件。

10.13 输入 7za ,正常会输出 7zip 的版本等信息。
在这里插入图片描述
10.14 解压示例;在 Xshell 中进入压缩包所在目录,其中 -o 后的参数即解压的目标路径,中间无空格。

7za x 01.zip -o目标路径

10.15 压缩示例;在 Xshell 中进入需要压缩的文件夹所在目录。

7za a 01.7z 文件夹名

10.16 实测发现在本地使用 7zip 来解压或者压缩比较大的文件会特别慢,或许应该对此也使用作业的形式提交到平台来运行,但是具体的方式还没有尝试。。

11. 其他

11.1 常见作业的不同状态及其含义

状态含义
RUN作业已经提交,程序正在运行
EXIT作业异常退出,一般是代码存在问题,可以查看 error.txt 查看报错
DONE作业完成,程序正常结束
PEND作业正在排队中,程序还未开始运行

11.2 提交作业不需要具体指定需要多少个 GPU,只需要在代码里设置好需要的 GPU 数目即可,不设置默认 0 号 GPU;指定 GPU 数量和编号需要在提交的作业文件里进行设置,方法也非常简单,如下。需要注意的是,在设置前将代码改成多卡训练的,否则代码会默认选择指定的 GPU 序列中的第一块卡来执行。

import os
os.environ["CUDA_VISIBLE_DEVICES"] = '0, 3, 4'

11.3 提交的主 python 代码第一行需要有解释器的定义,其他被主代码调用的包不需要添加。

#!/data/users/CHDHPC/2022024024/software/anaconda3/bin/python3

11.4 如果需要跑一个完整的项目,引用的代码需要放在与主代码同级目录下才能直接调用,因为在交互式环境中运行 python 不像在 Pycharm 中可以设置 source root 文件夹;但是也可以通过如下方式来调用,在 . 之前的即为该项目下与 train.py 同级的 models 文件夹。
在这里插入图片描述
11.5 如果在作业提交后需要终止作业,可以在网页版高算平台我的作业里终止,也可以在 Xshell 中输入 jctrl kill 作业号 来终止指定作业号的作业;此时再查看作业状态就会显示 DONE。
在这里插入图片描述
11.6 报错:SyntaxError: EOL while scanning string literal;这是因为没有将路径放在引号内。

11.7 删除文件或文件夹的时候如果在 Xftp 里删除或非常慢,建议在 Xshell 里使用如下命令来删除。

rm -f 文件名
rm -rf 文件夹

11.8 我建议的一个完整的 Pytorch 作业提交流程是:

a. 将代码文件格式由 windows 格式改为 Unix 格式,即 9.2 节;
b. 在主代码最开始一行加上解释器的定义,即 11.3 节;
c. 先提交运行 test.py 的脚本文件到某一个节点上来判断当前节点上的 GPU 占用情况,即 9.9 节;
d. 选择空闲较大的 GPU 来提交作业,即 11.2 节;
e. 给整个项目文件夹编辑权限,即 9.3 节;
f. 提交主代码文件的脚本文件,即 9.10 节。

结语

如果我的教程对于你的研究有所帮助,麻烦点赞收藏。另外,对于其中存在的不足请大家不吝指出,我会在合适的时间对其进行修改。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1170255.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Aop自定义注解生成日志

Aop自定义注解生成日志 1.编写自定义注解 //表示此注解可以标注在方法上 Target(ElementType.METHOD) //运行时生效 Retention(RetentionPolicy.RUNTIME) public interface OpetionLog {//定义一个变量&#xff0c;可以接收参数String value() default "";}2.Cont…

Leetcode 剑指 Offer II 051. 二叉树中的最大路径和

题目难度: 困难 原题链接 今天继续更新 Leetcode 的剑指 Offer&#xff08;专项突击版&#xff09;系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 路径 被定义为一条从树中任意节点出发&#xff0c;沿父节点-子节…

微信CRM系统在电商行业的应用

随着移动互联网的快速发展&#xff0c;微信已经成为电商行业重要的营销和客户服务渠道。然而&#xff0c;如何在海量的微信消息中保持客户沟通、提升客户体验、实现精准营销&#xff0c;是电商行业面临的一大挑战。微信CRM系统作为一种新型的客户关系管理工具&#xff0c;可以有…

【qemu逃逸】HWS2017-FastCP

前言 虚拟机用户名&#xff1a;root 虚拟机密码&#xff1a;无密码 本题有符号&#xff0c;所以对于设备定位啥的就不多说了&#xff0c;直接逆向设备吧。 设备逆向 在 realize 函数中设置一个时钟任务&#xff0c;并且可以看到只注册了 mmio&#xff0c;大小为 0x100000。…

Web应用多账号系统设计及微信扫码登录实现

1 前言概述 公司对功能测试&#xff0c;性能测试&#xff0c;安全测试等等都做了比较好的自动化后&#xff0c;急需要一个MIS系统来统一管理这些结果及报表。 此MIS系统特点如下&#xff1a; 仅内部人员使用部署在公网 基于如上特点&#xff0c;显然让公司的人为这样一个…

算法随想录算法训练营第四十九天| 503.下一个更大元素II 42. 接雨水

503.下一个更大元素II 题目&#xff1a;给定一个循环数组 nums &#xff08; nums[nums.length - 1] 的下一个元素是 nums[0] &#xff09;&#xff0c;返回 nums 中每个元素的 下一个更大元素 。数字 x 的 下一个更大的元素 是按数组遍历顺序&#xff0c;这个数字之后的第一个…

mes生产管理系统| T-MES管理软件 智能制造 生产协同

思伟软件 T-MES管理软件 智能制造 生产协同 智能制造协同管理 告别繁琐 不再出错 打通混凝土电子化生产全流程 提升搅拌站调度效率 原材料进料监管安全有保障 跨部门高效协同 生产部 管理销售合同、任务单&#xff0c;下达生产任务&#xff1b; 查看/修改/导出/打印发货…

OpenGL库安装

1 库安装本文不说 Win10 GLEW GLFW OpenGL VS2019 环境配置 - 知乎 (zhihu.com) 安装osg库&#xff0c;里面也有GL第三方库的下载方法&#xff0c;见我其他博客 2 OpenGL入门案例一 #include <GL/glut.h>void display() {glClear(GL_COLOR_BUFFER_BIT);glBegin(GL…

前端下载后端文件流,文件可以下载,但是打不开,显示“文件已损坏”的问题分析与解决方案

目录 场景还原相关代码开发者工具 - 网络请求记录 问题排查定位改bug 总结 场景还原 我在前端使用axios接收后端xlsx表格文件流并下载&#xff0c;xlsx文件能够下载成功&#xff0c;但是打开却显示文件无法打开 相关代码 请求API封装:Content–Type以及responseType经核对均…

使用navicat操纵数据库

<1>连接数据库 打开Navicat&#xff0c;点击“连接”&#xff0c;选择“MySQL”&#xff0c;这边是本机安装的mysql,主机为localhost&#xff0c;输入root密码。 使用Navicat创建数据库并导入SQL文件 SQL查询 普通SQL查询 USE demo; SELECT * FROM t_emp;SELECT emp…

HNU程序设计 练习四-数组(强化)

1.快速公交BRT 【问题描述】 在城市里&#xff0c;快速公交&#xff08;BRT&#xff09;线路为一条直线&#xff0c;在其线路上有 n 个交叉路口&#xff0c;在每个路口都有一个交通信号灯&#xff0c;在红灯与绿灯之间周期性循环。 在绿灯亮起持续 g 秒的期间&#xff0c;允许…

qt5.15.2+vs2019源码调试开发环境搭建

说明 一些qt文件不进行源码调试无法知道其中的原理。提高软件质量&#xff0c;从概念原理及应用角度看待必须知道qt类运行原理。 1.安装 在网上找到qt安装包qt-unified-windows-x64-4.5.1-online.exe&#xff0c;安装qt5.15.2&#xff0c;有选择Qt Debug Information Files …

mysql高级函数——GROUP_CONCAT

分组拼接GROUP_CONCAT(expr) group_concat函数 实现分组查询之后的数据进行合并&#xff0c;并返回一个字符串结果。用于将多个字符串拼接成一个字符串。MySql默认的最大拼接长度为1024个字节 应用场景&#xff1a;按照产品编码分组&#xff0c;获取生效策略 SELECTproduct_n…

漏洞分析 | U8 Cloud ServiceDispatcher反序列化漏洞及补丁分析

0x01 概述 近期&#xff0c;爆出了 U8cloud ServiceDispatcherServlet 接口的反序列化漏洞。在对该漏洞进行分析时&#xff0c;我们发现 NC 也曾出现过 ServiceDispatcherServlet 接口的反序列化漏洞。经过分析后发现&#xff0c;这两个漏洞的功能代码实现方式并不相同。但二者…

5.1用栈实现队列(LC232-E)

算法&#xff1a; 这道题就是用栈模拟队列。 举个例子理解&#xff1a; 输入&#xff1a; ["MyQueue", "push", "push", "peek", "pop", "empty"] [[], [1], [2], [], [], []] 输出&#xff1a; [null, null, …

二叉树第i层结点个数

//二叉树第i层结点个数 int LevelNodeCount(BiTree T, int i) {if (T NULL || i < 1)return 0;if (i 1) return 1;return LevelNodeCount(T->lchild, i - 1) LevelNodeCount(T->rchild, i - 1); } int GetDepthOfBiTree(BiTree T) {if (T NULL)return 0;return Ge…

Linux - 进程控制(下篇)- 进程等待

进程等待 为什么进程需要等待&#xff1f; 我们知道&#xff0c;在Linux 当中&#xff0c;父子进程之间一些结构就是一些多叉树的结构&#xff0c;一个父进程可能管理或者创建了很多个字进程。 而其实我们在代码当中使用fork&#xff08;&#xff09;函数创建的子进程的父进程…

Paddle炼丹炉炸了Unexpected BUS error encountered in DataLoader worker

Paddle训练报错&#xff0c;内存不足 python train.py -c config/ResNet_W18.yaml修改配置文件config/ResNet_W18.yaml # 原配置 loader:num_workers: 4use_shared_memory: True# 修改后 loader:num_workers: 2use_shared_memory: False

《申论技巧》

一、做题过程 做题过程&#xff1a; 四个要素分析题干 一对多&#xff1a;考虑材料之间的灵活运用&#xff1b;问题对策&#xff1b;并列&#xff1b;主材料与辅材料 多个题目对应一个一篇材料&#xff1b;答案各有侧重&#xff0c;不重合 主体内容 二、读材料 2.1 粗读…

Makefile实例

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 例如&#xff1a;…