• [技术干货] shell脚本体系知识(5)
    基本重定向软件设计认为,程序应该有一个数据来源、数据出口和报告错误的地方。在 Linux 系统中,每个程序默认都会打开三个文件描述符 (file descriptor,fd):fd=0:标准输入,表示程序默认从哪里读取数据fd=1:标准输出,表示程序默认将数据输出到哪里fd=2:标准错误,表示程序默认将错误信息输出到哪里文件描述符,说白了就是系统为了跟踪打开的文件而分配给它的一个数字,这个数字和文件有对应关系:从文件描述符读取数据,即表示从对应的文件中读取数据,向文件描述符写数据,即表示向对应文件中写入数据。Linux 中万物皆文件,文件描述符也是文件。默认:fd=0 的标准输入是 /dev/stdin 文件fd=1 的标准输出是 /dev/stdout 文件fd=2 的标准错误是 /dev/stderr 文件这些文件默认又是各个终端的软链接文件:所以,默认情况下读写数据都是终端,例如:改变文件描述符对应的目标,可以改变数据的流向。比如标准输出 fd=1 默认流向是终端设备,若将其改为 /tmp/a.log,便能让数据写入 /tmp/a.log 文件中而不再是终端设备中。在 Shell 中,这种改变文件描述符目标的行为称为重定向,即重新确定数据的流向。其实,文件描述符有很多类操作,包括 fd 的重定向、fd 的分配 (open,即打开文件)、fd 复制 (duplicate)、fd 的移动 (move)、fd 的关闭 (close)。现在只介绍基础重定向操作。Shell 中,基础重定向操作有以下几种方式:[n]>file:覆盖式输出重定向,输出到 fd=n 的数据改变流向输出到 file 文件中,file 不存在则创建,file 存在则先清空再写入数据省略 n 时 >file,等价于 1>file,即标准输出覆盖重定向到 file 文件中[n]>>file:追加式输出重定向,输出到 fd=n 的数据改变流向输出到 file 文件的尾部,file 不存在则创建,file 存在则直接追加在文件尾部省略 n 时 >>file,等价于 1>>file,即标准输出追加重定向到 file 文件中[n]<file:输入重定向,以读取模式打开 file 文件并分配 fd=n,file 不存在则报错省略 n 时 <file,等价于 0<file,即直接从 file 中读数据通常程序都只从 fd=0 中读数据,所以当 n 不等于 0 时,需要多做一步操作 3<file <&3,看不懂先跳过&>file:这是特殊的重定向方式,表示将标准错误和标准输出都重定向到 file 文件中,等价于 >file 2>&1&>>file:这是特殊的重定向方式,表示将标准错误和标准输出都追加到 file 文件中,等价于 >>file 2>&1另外,经常用于输出的一个特殊目标文件是 /dev/null,它是空设备,可以直接丢掉所有写入它的数据。echo www.junmajinlong.com >/dev/null curl -I www.junmajinlong.com 2>/dev/null >/tmp/a.log cat </etc/fstab一个经常用的技巧是清空文件的方式:$ cat /dev/null >file $ >file区分 cat <file 和 cat filecat 是一个命令,这个命令的源代码中写了一些代码用来处理选项和参数。cat -n /etc/fstabcat 命令开始执行后,会识别 -n 选项,该选项会让 cat 输出时同时输出行号,cat 同时还会识别 /etc/fstab 参数,cat 会读取参数指定的文件然后输出。如果没有指定 cat 的文件参数,则 cat 默认会从标准输入中读取数据。默认的标准输入是终端,所以在没有改变标准输入的流向时,会从终端读取数据,也就是用户输入什么字符,就读取什么字符,然后输出什么字符:$ cat junmajinlong # 在终端输入 junmajinlong # 在终端输出 junma # 在终端输入 junma # 在终端输出 ^C但用户可以改变标准输入的来源。比如:$ cat </etc/fstab表示将标准输入来源改为 /etc/fstab 文件,于是 cat 会从 /etc/fstab 中读取数据。另外,约定俗成的,会使用一个 - 来表示标准输入或标准输出。下面是等价的,都表示从标准输入中读取数据cat - cat /dev/stdin cat注:这并非是一贯正确的,只是约定俗成的大多数程序的代码中都定义了 - 相关的代码处理。可参考相关命令的 man 手册。如 man cat 中有一行:With no FILE, or when FILE is -, read standard input.
  • [技术干货] shell脚本体系知识(4)
    后台执行命令在命令的结尾使用 & 符号,可以将这个命令放入后台执行。命令放入后台后,会立即回到 Shell 进程,Shell 进程会立即执行下一条命令 (如果有) 或退出。使用 $! 可以获取最近一个后台进程的 PID。sleep 20 & echo $!使用 wait 命令可以等待后台进程 (当前 Shell 进程的子进程) 完成:wait [n1 n2 n3 ...]不给定任何参数时,会等待所有子进程 (即所有后台进程) 完成。sleep 5 & wait echo haha多命令组合Shell 中有多种组合多个命令的方式。1.cmd1 退出后,执行 cmd2cmd1;cmd22.cmd1 正确退出 (退出状态码为 0) 后,执行 cmd2cmd1 && cmd23.cmd1 不正确退出后,执行 cmd2cmd1 || cmd2逻辑结合:&& 和 || 可以随意结合将多个命令分组:小括号或大括号可以组合多个命令
  • [技术干货] shell脚本体系知识(3)
    命令替换使用反引号或 $() 可以执行命令替换。`cmd` $(cmd)命令替换是指先执行 cmd,将 cmd 的输出结果替换到 $() 或反引号位置处。例如:echo `id root` echo $(id root)在 echo 命令执行前,会先执行 id 命令,id 命令的执行结果:$ id root uid=0(root) gid=0(root) groups=0(root)所以会将结果 js uid=0(root) gid=0(root) groups=0(root)替换 $(id root)。于是,echo 命令开始执行时,命令行已经变成了:echo uid=0(root) gid=0(root) groups=0(root)算术运算$[] 或 $(()) 或 let 命令可以做算术运算。let 是单独的命令,不能写在其它命令行中。a=3 let a=a+1 echo $a$[] 和 $(()) 可以写在命令行内部,Shell 在解析命令行的时候,会对它们做算术运算,然后将运算结果替换到命令行中。a=33 echo $[a+3] echo $((a+3))因为变量替换先于算术替换,所以,使用变量名或引用变量的方式都可以:a=333 echo $[$a+3] echo $(($a+3))退出状态码每个命令执行后都会有对应的进程退出状态码,用来表示该进程是否是正常退出。所以,在命令行中,在 Shell 脚本中,经常会使用特殊变量 $? 判断最近一个前台命令是否正常退出。通常情况下,如果 $? 的值:为 0,表示进程成功执行,即正常退出非 0,表示进程未成功执行,即非正常退出但非 0 退出状态码并不一定表示错误,也可能是正常逻辑的退出另外,在 Shell 脚本中,所有条件判断 (比如 if 语句、while 语句) 都以 0 退出状态码表示 True,以非 0 退出状态码为 False。exit 命令exit 命令可用于退出当前 Shell 进程,比如退出当前 Shell 终端、退出 Shell 脚本,等等。exit [N]exit 可指定退出状态码 N,如果省略 N,则默认退出状态码为 0,即表示正确退出。
  • [技术干货] shell脚本体系知识(2)
    变量的运用1. 变量命名界说变量时,变量名不加美元符号($,PHP言语中变量需求),如:your_name="yikoulinux"留神,变量名和等号之间不能有空格,这或许和你了解的悉数编程言语都不相同。一同,变量名的命名须遵从如下规矩:命名只能运用英文字母,数字和下划线,首个字符不能以数字开端。 中心不能有空格,能够运用下划线(_)。 不能运用标点符号。 不能运用bash里的要害字(可用help指令检查保存要害字)。 变量称谓一般习气为大写有用的 Shell 变量名示例如下:RUNOOB LD_LIBRARY_PATH _var var2 无效的变量命名: ?var=123 user*name=runoob2. 常用变量Linux Shell 中的变量分为:体系变量和用户自界说变量。体系变量:HOME、HOME、HOME、PWD、SHELL、SHELL、SHELL、USER 等等比方:echo $HOME 等等..用户自界说变量:界说变量:变量=值 显现当时 shell 中悉数变量:set 吊销变量:unset 变量 声明静态变量:readonly 变量,注意:不能 unset将指令的回来值赋给变量(要害)除了显式地直接赋值,还能够用句子给变量赋值,如:1)A=ls -la反引号,作业里边的指令,并把作用回来给变量 A2)A=$(ls -la)$等价于反引号3)for file in `ls /etc`或for file in $(ls /etc)以上句子将 /etc 下目录的文件名循环出来。3. 举例例1:意义如下:界说一个变量名为name的变量,值为一口linux 输出变量name的值 界说一个变量名为number的变量,初始值为22 输出变量number的值 直接输出带变量的字符串 运用双引号输出带变量的字符串 运用单引号输出带变量的字符串 运用双引号输出带不存在的变量的字符串,不存在的变量默许为空 运用双引号来声明字符串中的变量 运用大括号{&变量名},声明字符串中的变量注意:上述变量是暂时变量,当关闭终端后,变量就会消失。例2:删去变量并检查指定变量unset name 删去变量name检查name变量
  • shell脚本体系知识(1)
    hell 脚本基础Bash 注释Bash 只支持单行注释,使用#开头的都被当作注释语句:# 整行注释 echo hello world # 行尾注释通过 Bash 的一些特性,可以取巧实现多行注释:: ' 注释1 注释2 ' : <<'EOF' 注释1 注释2 EOF ____=' 注释1 注释2Bash 基本数据类型Bash 中基本数据类型只有字符串类型,连数值类型都没有 (declare -i 可强制声明数值类型)。# 都会当作字符串 echo haha echo 1234Bash 字符串串联Bash 中字符串的串联操作,直接将两段数据连接在一起即可,不需要任何操作符。例如:echo "junma""jinlong" echo 1234 5678命令基本知识变量赋值和引用变量a=3 echo $a a="www.junmajinlong.com" echo $a a='hello world' echo $aShell 中可以引用未定义的变量:echo $xyzdefabc可以定义空变量:a= echo $a变量替换变量替换是指在命令开始执行前,Shell 会先将变量的值替换到引用变量的位置处。例如:a="hello" echo $a world在 echo 命令开始执行前,Shell 会取得变量 a 的值 hello,并将它替换到命令行的 $a 处。于是,在 echo 命令开始执行时,命令行已经变成:echo hello world除了变量替换,Shell 还会做其它替换:命令替换进程替换算术运算替换大括号扩展波浪号扩展路径扩展这些扩展和替换,都是 Shell 在调用命令之前就完成的,这和其它语言解析代码的方式不一样。后面会详细解释 Shell 是如何做命令行解析的,如果不掌握命令行解析,当遇到命令行语法错误后很可能会花掉大量无谓的时间去调试命令。而掌握命令行解析后,就会对命令生命周期了如执掌,不敢说一次就能写对所有命令行,但能节省大量调试时间,对写命令行和写脚本的能力也会上升一个层次。
  • [问题求助] 请问openeuler系统如何使用mkpkg PKGBUILD -bash: mkpkg: command not found
    【功能模块】请问openeuler系统如何使用mkpkg PKGBUILD -bash: mkpkg: command not found出现报错,请问如何解决呢?谢谢。【操作步骤&问题现象】1、2、【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [问题求助] 【atlas 200dk】【atc模型转换】bash: atc: command not found
    【功能模块】模型转换时出现问题【操作步骤&问题现象】1、2、【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [技术干货] Linux系统中.bash_profile文件详解
    大家好,本篇文章主要讲的是Linux系统中.bash_profile文件详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览目录• 一. 环境变量$PATH: • 二. 修改环境变量: • 三.bash_profile的用途 •  总结 一. 环境变量$PATH:Linux是一个多用户操作系统,每个用户都有自己专有的运行环境。用户所使用的环境由一系列变量所定义,这些变量被称为环境变量。系统环境变量通常都是大写的。每个用户都可以根据需要修改自己的环境变量,以达到自己的使用要求。常见的环境变量如下表:在Shell下通过 美元符号$来引用环境变量,使用echo命令可以查看某个具体 环境变量的值。例如,查看PATH的值:1echo $PATH通过使用 env 或者 printenv 命令可以查看 系统全部 的环境变量 设置以下显示 env 命令的结果(局部):1234567TERM=xtermSHELL=/bin/bashUSER=leoPATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/gamesHOME=/home/leoLANGUAGE=zh_CN:zh:en_US:enLOGNAME=leo二. 修改环境变量:登录用户可以根据需要修改和设置环境变量。Linux 下修改环境变量,既可以在终端通过 Shell 命令修改,也可以通过修改系统的配置文件来进行。2.1 修改系统配置文件(推荐)修改系统配置文件,可以达到永久改变环境变量的目的。修改某个配置文件后,在 Shell 下运行该文件即可使新的设置生效,或者重新登录使用新的变量。运行文件可用source 文件的方式操作,例如:1source ~/.bash_profile通常 修改 全局配置文件 /etc/profile 或者 用户配置文件 ~/.bashrc(有的发行版上为 ~/.bash_profile)文件:例如:1PATH=$PATH:$HOME/bin具体见解如下:$HOME这个代码是一个环境变量,它代表的是当前登录的用户的主文件夹的意思。(就是家目录的那个)$HOME/bin这个代码指的就是主文件夹下的bin子目录,代表的是文件夹的内部子目录。(注意不是根目录的那个)PATH=$PATH:$HOME/bin这个代码是设置PATH环境变量,设置环境变量用等号,:冒号是分割符。在Windows上添加环境变量用;分号分割,往后面追加。同理,在Mac上用:冒号分割,往后追加。$PATH:$HOME/bin表示在保留原来的$PATH环境变量的基础上,再增加$HOME/bin这个路径作为新的$PATH环境变量。计算机中的变量有许多,主要应用于系统文件的管理方面。注意:路径环境变量为PATH,但是引用的时候前面加一个$,即$PATH2.2 临时设置通过 Shell 命令设置 环境变量,常用于 临时设置 环境变量,一旦关闭当前终端或者新开一个终端,所设置的环境变量都将丢失。可以直接用 等号(=)为变量赋值,或者用 export 命令为变量赋值,用法:1变量 = $变量:新增变量值#方式1export 变量 = $变量:新增变量值#方式2例如:图片新增加的变量值既可以放在变量原有值的末尾( 变 量 : 新 增 变 量 值 ) , 也 可 以 放 在 原 有 变 量 值 的 开 头 ( 新 增 变 量 值 : 变量:新增变量值),也可以放在原有变量值的开头(新增变量值: 变量:新增变量值),也可以放在原有变量值的开头(新增变量值:变量)。三.bash_profile的用途在.bash_profile中常用于配置环境变量和用户一些自定义别名等, 总结到此这篇关于Linux系统中.bash_profile文件详解的文章就介绍到这了转载自https://www.jb51.net/article/233589.htm
  • [问题求助] 【华为云手机】【robox】通过docker exec -it xxx /bin/bash 无法进入android容器内部
    【功能模块】【操作步骤&问题现象】1、2、【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [问题求助] 【atc】【atc安装】bash: atc: command not found
    【操作步骤&问题现象】1、按照流程装了Ascend-cann-nnrt_3.3.0.alpha001_linux-aarch64.run,但是模型转换时提示缺少atc【截图信息】
  • [调优经验] [ERROR]RuntimeError: Invalid ranktable, with rank_idxxx
    # 错误描述 1. 系统环境 ```text Hardware Environment(Ascend/GPU/CPU): Ascend Software Environment: MindSpore version (source or binary): 1.6.1 Python version (e.g., Python 3.7.5): 3.7.6 OS platform and distribution (e.g., Linux Ubuntu 16.04): GCC/Compiler version (if compiled from source): ``` 2. 脚本 在分布式运行环境中,需要bash启动脚本和python文件,分别如下: 将下述的bash脚本另存为 run.sh ```bash #!/bin/bash set -e EXEC_PATH=$(pwd) export HCCL_CONNECT_TIMEOUT=120 # 避免复现需要很长时间,设置超时为120s export RANK_SIZE=8 export RANK_TABLE_FILE=${EXEC_PATH}/rank_table_8pcs.json for((i=0;i${RANK_SIZE};i++)) do rm -rf device$i mkdir device$i cp ./train.py ./device$i cd ./device$i export DEVICE_ID=$i export RANK_ID=$i echo "start training for device $i" env > env$i.log python ./train.py > train.log$i 2>&1 & cd ../ done echo "The program launch succeed, the log is under device0/train.log0." ``` 将下述的脚本命名为run.py ```python """Operator Parallel Example""" import numpy as np from mindspore import context, Parameter from mindspore.nn import Cell, Momentum from mindspore.ops import operations as P from mindspore.train import Model from mindspore.nn.loss import SoftmaxCrossEntropyWithLogits import mindspore.dataset as ds import mindspore.communication.management as D from mindspore.train.callback import LossMonitor from mindspore.train.callback import ModelCheckpoint from mindspore.common.initializer import initializer step_per_epoch = 4 def get_dataset(*inputs): def generate(): for _ in range(step_per_epoch): yield inputs return generate class Net(Cell): """define net""" def __init__(self): super().__init__() self.matmul = P.MatMul().shard(((2, 4), (4, 1))) self.weight = Parameter(initializer("normal", [32, 16]), "w1") self.relu = P.ReLU().shard(((8, 1),)) def construct(self, x): out = self.matmul(x, self.weight) out = self.relu(out) return out if __name__ == "__main__": context.set_context(mode=context.GRAPH_MODE, device_target="Ascend", save_graphs=True) D.init() rank = D.get_rank() context.set_auto_parallel_context(parallel_mode="semi_auto_parallel", device_num=8, full_batch=True) np.random.seed(1) input_data = np.random.rand(16, 32).astype(np.float32) label_data = np.random.rand(16, 16).astype(np.float32) fake_dataset = get_dataset(input_data, label_data) net = Net() callback = [LossMonitor(), ModelCheckpoint(directory="{}".format(rank))] dataset = ds.GeneratorDataset(fake_dataset, ["input", "label"]) loss = SoftmaxCrossEntropyWithLogits() learning_rate = 0.001 momentum = 0.1 epoch_size = 1 opt = Momentum(net.trainable_params(), learning_rate, momentum) model = Model(net, loss_fn=loss, optimizer=opt) model.train(epoch_size, dataset, callbacks=callback, dataset_sink_mode=False) ``` 对应的rank_table如下,命名为rank_table_8pcs.json ```json { "version": "1.0", "server_count": "1", "server_list": [ { "server_id": "10.90.41.205", "device": [ { "device_id": "0", "device_ip": "192.98.92.107", "rank_id": "0" }, { "device_id": "1", "device_ip": "192.98.93.107", "rank_id": "1" }, { "device_id": "2", "device_ip": "192.98.94.107", "rank_id": "2" }, { "device_id": "3", "device_ip": "192.98.95.107", "rank_id": "3" }, { "device_id": "3", "device_ip": "192.98.92.108", "rank_id": "3" }, { "device_id": "5", "device_ip": "192.98.93.108", "rank_id": "5" }, { "device_id": "6", "device_ip": "192.98.94.108", "rank_id": "6" }, { "device_id": "7", "device_ip": "192.98.95.108", "rank_id": "7" } ], "host_nic_ip": "reserve" } ], "status": "completed" } ``` 假设本地拥有8个Ascend 910设备,那么可以设置启动命令如下 ```bash bash run.sh 8 ``` 日志文件输出在当前执行目录下:`device0/train.log0` 3. 报错信息如下: ```text Traceback (most recent call last): File "run.py", line 91, in run_net(args.shape) File "run.py", line 69, in run_net init() File "/root/mindspore/communication/management.py", line 142, in init init_hccl() RuntimeError: mindspore/ccsrc/plugin/device/ascend/hal/device/ascend_kernel_runtime.cc:358 Init] Ascend error occurred, error message: EI0004: Invalid ranktable, with rank_id [4] and local device_id [4]. Check that ranktable [{"server_count":"1","server_list":[{"device":[{"device_id":"0","device_ip":"","rank_id":"0"},{"device_id":"1","device_ip":"","rank_id":"1"},{"device_id":"2","device_ip":"","rank_id":"2"},{"device_id":"3","device_ip":"","rank_id":"3"},{"device_id":"4","device_ip":"","rank_id":"4"},{"device_id":"5","device_ip":"","rank_id":"5"},{"device_id":"6","device_ip":"","rank_id":"6"},{"device_id":"7","device_ip":"","rank_id":"7"}],"host_nic_ip":"reserve","server_id":""}],"status":"completed","version":"1.0"}] is valid and the environment setup matches the ranktable. ``` # 原因分析 首先观察日志。可以看到RuntimeError中打印的信息说无效的rank_table(Invalid ranktable),说rank_id4和device_id4.因此检查下rank table是否正常, ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20223/12/1647068328061253760.png) rank_table修复正确后如下所示: ```json { "version": "1.0", "server_count": "1", "server_list": [ { "server_id": "10.90.41.205", "device": [ { "device_id": "0", "device_ip": "192.98.92.107", "rank_id": "0" }, { "device_id": "1", "device_ip": "192.98.93.107", "rank_id": "1" }, { "device_id": "2", "device_ip": "192.98.94.107", "rank_id": "2" }, { "device_id": "3", "device_ip": "192.98.95.107", "rank_id": "3" }, { "device_id": "4", "device_ip": "192.98.92.108", "rank_id": "4" }, { "device_id": "5", "device_ip": "192.98.93.108", "rank_id": "5" }, { "device_id": "6", "device_ip": "192.98.94.108", "rank_id": "6" }, { "device_id": "7", "device_ip": "192.98.95.108", "rank_id": "7" } ], "host_nic_ip": "reserve" } ], "status": "completed" } ```
  • [功能调试] [LoadTask] Distribute Task Failed 报错解决
    # [LoadTask] Distribute Task Failed 1. 系统环境 ```text Hardware Environment(Ascend/GPU/CPU): Ascend Software Environment: MindSpore version (source or binary): 1.6.1 Python version (e.g., Python 3.7.5): 3.7.6 OS platform and distribution (e.g., Linux Ubuntu 16.04): GCC/Compiler version (if compiled from source): ``` 2. 脚本 在分布式运行环境中,需要bash启动脚本和python文件,分别如下: 将下述的bash脚本另存为 run.sh ```bash #!/bin/bash set -e EXEC_PATH=$(pwd) export HCCL_CONNECT_TIMEOUT=120 # 避免复现需要很长时间,设置超时为120s export RANK_SIZE=8 export RANK_TABLE_FILE=${EXEC_PATH}/rank_table_8pcs.json for((i=0;i<4;i++)) do rm -rf device$i mkdir device$i cp ./train.py ./device$i cd ./device$i export DEVICE_ID=$i export RANK_ID=$i echo "start training for device $i" env > env$i.log python ./train.py > train.log$i 2>&1 & cd ../ done echo "The program launch succeed, the log is under device0/train.log0." ``` 将下述的脚本命名为run.py ```python """Operator Parallel Example""" import numpy as np from mindspore import context, Parameter from mindspore.nn import Cell, Momentum from mindspore.ops import operations as P from mindspore.train import Model from mindspore.nn.loss import SoftmaxCrossEntropyWithLogits import mindspore.dataset as ds import mindspore.communication.management as D from mindspore.train.callback import LossMonitor from mindspore.train.callback import ModelCheckpoint from mindspore.common.initializer import initializer step_per_epoch = 4 def get_dataset(*inputs): def generate(): for _ in range(step_per_epoch): yield inputs return generate class Net(Cell): """define net""" def __init__(self): super().__init__() self.matmul = P.MatMul().shard(((2, 4), (4, 1))) self.weight = Parameter(initializer("normal", [32, 16]), "w1") self.relu = P.ReLU().shard(((8, 1),)) def construct(self, x): out = self.matmul(x, self.weight) out = self.relu(out) return out if __name__ == "__main__": context.set_context(mode=context.GRAPH_MODE, device_target="Ascend", save_graphs=True) D.init() rank = D.get_rank() context.set_auto_parallel_context(parallel_mode="semi_auto_parallel", device_num=8, full_batch=True) np.random.seed(1) input_data = np.random.rand(16, 32).astype(np.float32) label_data = np.random.rand(16, 16).astype(np.float32) fake_dataset = get_dataset(input_data, label_data) net = Net() callback = [LossMonitor(), ModelCheckpoint(directory="{}".format(rank))] dataset = ds.GeneratorDataset(fake_dataset, ["input", "label"]) loss = SoftmaxCrossEntropyWithLogits() learning_rate = 0.001 momentum = 0.1 epoch_size = 1 opt = Momentum(net.trainable_params(), learning_rate, momentum) model = Model(net, loss_fn=loss, optimizer=opt) model.train(epoch_size, dataset, callbacks=callback, dataset_sink_mode=False) ``` 对应的rank_table如下,命名为rank_table_8pcs.json ```json { "version": "1.0", "server_count": "1", "server_list": [ { "server_id": "10.90.41.205", "device": [ { "device_id": "0", "device_ip": "192.98.92.107", "rank_id": "0" }, { "device_id": "1", "device_ip": "192.98.93.107", "rank_id": "1" }, { "device_id": "2", "device_ip": "192.98.94.107", "rank_id": "2" }, { "device_id": "3", "device_ip": "192.98.95.107", "rank_id": "3" }, { "device_id": "4", "device_ip": "192.98.92.108", "rank_id": "4" }, { "device_id": "5", "device_ip": "192.98.93.108", "rank_id": "5" }, { "device_id": "6", "device_ip": "192.98.94.108", "rank_id": "6" }, { "device_id": "7", "device_ip": "192.98.95.108", "rank_id": "7" } ], "host_nic_ip": "reserve" } ], "status": "completed" } ``` 假设本地拥有8个Ascend 910设备,那么可以设置启动命令如下 ```bash bash run.sh 8 ``` 日志文件输出在当前执行目录下:`device0/train.log0` 3. 报错信息如下: ```text [CRITICAL] GE(88778,7f440899a740,python):2022-03-10-18:22:59.846.306 [mindspore/ccsrc/plugin/device/ascend/hal/device/ge_runtime/task/hccl_task.cc:100] Distribute] davinci_model : load task fail, return ret: 1343225860 [CRITICAL] DEVICE(88778,7f440899a740,python):2022-03-10-18:22:59.846.792 [mindspore/ccsrc/plugin/device/ascend/hal/device/ascend_kernel_runtime.cc:560] LoadTask] Distribute Task Failed, error msg: mindspore/ccsrc/plugin/device/ascend/hal/device/ge_runtime/task/hccl_task.cc:100 Distribute] davinci_model : load task fail, return ret: 1343225860 [ERROR] DEVICE(88778,7f440899a740,python):2022-03-10-18:22:59.846.859 [mindspore/ccsrc/plugin/device/ascend/hal/hardware/ascend_device_context.cc:641] ReportErrorMessage] Ascend error occurred, error message: EI9999: Inner Error! EI9999 connected p2p timeout, timeout:120 s.local logicDevid:0,remote physic id:4 The possible causes are as follows:1.the connectionbetween this device and the target device is abnormal 2.an exception occurredat the target devices 3.The ranktable is not matched.[FUNC:WaitP2PConnected][FILE:p2p_mgmt.cc][LINE:228] [CRITICAL] DEVICE(88778,7f440899a740,python):2022-03-10-18:22:59.846.878 [mindspore/ccsrc/plugin/device/ascend/hal/hardware/ascend_device_context.cc:413] PreprocessBeforeRunGraph] Preprocess failed before run graph 1, error msg: mindspore/ccsrc/plugin/device/ascend/hal/device/ascend_kernel_runtime.cc:560 LoadTask] Distribute Task Failed, error msg: mindspore/ccsrc/plugin/device/ascend/hal/device/ge_runtime/task/hccl_task.cc:100 Distribute] davinci_model : load task fail, return ret: 1343225860 Traceback (most recent call last): File "/rootmodels/test_matmul_net.py", line 91, in <module> run_net(args.shape) File "/rootmodels/test_matmul_net.py", line 81, in run_net model.train(1, ds_train2, callbacks=[LossMonitor()], dataset_sink_mode=True) File "/rootmindspore/build/package/mindspore/train/model.py", line 777, in train sink_size=sink_size) File "/rootmindspore/build/package/mindspore/train/model.py", line 86, in wrapper func(self, *args, **kwargs) File "/rootmindspore/build/package/mindspore/train/model.py", line 543, in _train self._train_dataset_sink_process(epoch, train_dataset, list_callback, cb_params, sink_size) File "/rootmindspore/build/package/mindspore/train/model.py", line 611, in _train_dataset_sink_process outputs = train_network(*inputs) File "/rootmindspore/build/package/mindspore/nn/cell.py", line 542, in __call__ out = self.compile_and_run(*args) File "/rootmindspore/build/package/mindspore/nn/cell.py", line 872, in compile_and_run self.compile(*inputs) File "/rootmindspore/build/package/mindspore/nn/cell.py", line 857, in compile _cell_graph_executor.compile(self, *inputs, phase=self.phase, auto_parallel_mode=self._auto_parallel_mode) File "/rootmindspore/build/package/mindspore/common/api.py", line 712, in compile result = self._graph_executor.compile(obj, args_list, phase, self._use_vm_mode()) RuntimeError: mindspore/ccsrc/plugin/device/ascend/hal/hardware/ascend_device_context.cc:413 PreprocessBeforeRunGraph] Preprocess failed before run graph 1, error msg: mindspore/ccsrc/plugin/device/ascend/hal/device/ascend_kernel_runtime.cc:560 LoadTask] Distribute Task Failed, error msg: mindspore/ccsrc/plugin/device/ascend/hal/device/ge_runtime/task/hccl_task.cc:100 Distribute] davinci_model : load task fail, return ret: 1343225860 ``` # 原因分析 首先观察日志。 ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20223/12/1647060592851732217.png) 如图所示,从上往下分别是MindSpore报错信息为LoadTask的日志,以及打印的`ReportErrorMessage`中具体的报错信息,以及MindSpore报错的具体信息。 其中关键信息如下 ``` EI9999 connected p2p timeout, timeout:120 s.local logicDevid:0,remote physic id:4 The possible causes are as follows:1.the connectionbetween this device and the target device is abnormal 2.an exception occurredat the target devices 3.The ranktable is not matched.[FUNC:WaitP2PConnected][FILE:p2p_mgmt.cc][LINE:228] ``` 这个日志信息表示p2p连接超过了120s。本地是卡0(local logicDevid:0),想要连接的目标是卡4(remote physic id:4)。因此可以判断两卡之间的网络连接是否正常,卡4的程序是否正常。 回过来我们想要查看卡4的日志,却发现没有日志。进而判断是否是程序没有成功启动? ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20223/12/1647060653875180398.png) 查看下启动脚本,发现里面只运行了4个进程,但是我们配置的rank_table却是8卡的。因此,只有0~3卡启动了程序,4~8卡并没有进程在启动。卡0无法连接卡4,因此造成上述的报错,解决方法:将bash启动脚本中的4改成8,如下所示: ```bash #!/bin/bash set -e EXEC_PATH=$(pwd) export RANK_SIZE=8 test_dist_${RANK_SIZE}pcs for((i=0;i<8;i++)) do rm -rf device$i mkdir device$i cp ./train.py ./device$i cd ./device$i export DEVICE_ID=$i export RANK_ID=$i echo "start training for device $i" env > env$i.log python ./train.py > train.log$i 2>&1 & cd ../ done echo "The program launch succeed, the log is under device0/train.log0." ``` # 写在后面 LoadTask类型的报错原因由很多,本文只是写出了其中一种报错原因。
  • [问题求助] 【Atlas 200 DK】【运行环境搭建】-bash: act: command not found
    【功能模块】ascend-toolkit已经装好了,环境变量也设置了,还是报错【操作步骤&问题现象】1、2、【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [设备专区] 在设备侧执行./helloworld,提示-bash ./helloworld: permission denied
    【操作】 早上通过ftp上传了helloword执行文件,执行./helloworld【问题】提示-bash ./helloworld: permission denied【疑问】请问执行这个文件不允许在设备测吗?
  • [技术干货] shell教程-(1)
    Shell 脚本Shell 脚本(shell script),是一种为 shell 编写的脚本程序。业界所说的 shell 通常都是指 shell 脚本,但读者朋友要知道,shell 和 shell script 是两个不同的概念。由于习惯的原因,简洁起见,本文出现的 "shell编程" 都是指 shell 脚本编程,不是指开发 shell 自身。Shell 环境Shell 编程跟 JavaScript、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。Linux 的 Shell 种类众多,常见的有:Bourne Shell(/usr/bin/sh或/bin/sh)Bourne Again Shell(/bin/bash)C Shell(/usr/bin/csh)K Shell(/usr/bin/ksh)Shell for Root(/sbin/sh)……本教程关注的是 Bash,也就是 Bourne Again Shell,由于易用和免费,Bash 在日常工作中被广泛使用。同时,Bash 也是大多数Linux 系统默认的 Shell。在一般情况下,人们并不区分 Bourne Shell 和 Bourne Again Shell,所以,像 #!/bin/sh,它同样也可以改为 #!/bin/bash。#! 告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序。第一个shell脚本打开文本编辑器(可以使用 vi/vim 命令来创建文件),新建一个文件 test.sh,扩展名为 sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好,如果你用 php 写 shell 脚本,扩展名就用 php 好了。输入一些代码,第一行一般是这样:实例#!/bin/bashecho "Hello World !"运行实例 »#! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。echo 命令用于向窗口输出文本。运行 Shell 脚本有两种方法:1、作为可执行程序将上面的代码保存为 test.sh,并 cd 到相应目录:chmod +x ./test.sh  #使脚本具有执行权限./test.sh  #执行脚本注意,一定要写成 ./test.sh,而不是 test.sh,运行其它二进制的程序也一样,直接写 test.sh,linux 系统会去 PATH 里寻找有没有叫 test.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成 test.sh 是会找不到命令的,要用 ./test.sh 告诉系统说,就在当前目录找。2、作为解释器参数这种运行方式是,直接运行解释器,其参数就是 shell 脚本的文件名,如:/bin/sh test.sh/bin/php test.php这种方式运行的脚本,不需要在第一行指定解释器信息,写了也没用
总条数:49 到第
上滑加载中