笔记¶
1.2 Career
职业规划:
职业规划是成为 AI系统的性能分析建模分析 -> 理解AI算法数学本质, 设计爆款AI算法应用:
- 测量各组件指标,
- HPCG,HPC, AI benchmark
- 分析理解应用瓶颈
计算机职业规划
- 自底向上分析理解和设计计算系统(系统建模与高层次的抽象) + 企业核心落地应用
- 融入公司的核心竞争力的发展。参与到低延迟,高并发的高性能系统的设计。(使用、理解、设计)
- 传统应用的优化入手,分析计算系统的上限和程序的性能释放瓶颈,从而了解系统瓶颈。并考虑上异构的系统或者FPGA来解决。
以性能优化为切入点,系统建模和分析数据流程之后,解析程序瓶颈(深入了解对应操作系统是如何调度实现的,来深入了解内核),探寻性能最佳的执行手段。
具体职位的转变
- 百度/华为AI系统(软件性能工程师) -> 应用在GPU上的适配的瓶颈 -> AI系统架构师 -> AGI系统架构师
- 阿里云 HPC组(深度学习虚拟化技术) -> mihoyo 的 云游戏部门
- 需要调研云游戏现状
- 互联网 -> 30岁考公回长沙
公司分析
候选公司
- 一线互联网BAT: 百度, 阿里, 腾讯, 字节
- 华为
- 美团,快手
- 新兴明星公司:mihoyo,小红书
甄别技巧
- 真想招聘人的公司,是能感受到那种诚意的,是站在用人的角度去考虑问题,基本问一些相关的情况。差不多能用就发offer了。3
- 有些公司明显就不想招人,不仅问的是否详细,内容也十分偏。折腾半天,最后也不了了之了。
- 除此之外有些公司只是为了解决自己的问题,面试是能感知到一些东西的,遇到明显套方案的公司,不要什么都说,要有所保留。
就业指导
- 选行业:关注国家政策,关注社会趋势
- 选平台:第一梯队,如果可能只要首位
- 选团队:选主不选辅,技术厚度,慎选小Team
- 选上级:经验,口碑,性格特点,梯队历史
- 看待遇:长期发展,短期收益,PK offer
指标一:大厂与国家的科研布局
华为遥遥领先,基础研发有待加强4
指标二:计算机相关的国内500强
普联是制造业的500强(1),和讯飞暂时还无法进入民营500强1
- 2023年制造业500强也找不到了
案例实践:2023秋招 华为 vs 百度
- 华为 - 昇腾产品线 - 昇腾计算开发使能部 - 软件开发工程师
- 百度 - TPG基础计算体系 - DLTP深度学习技术平台部 - 飞桨引擎异构部门 - 异构计算工程师
比较项 | 华为 | 百度 | 百度相较于华为 |
---|---|---|---|
公司影响力 | 爱国色彩,消费者认知 | 对于消费者还停留在搜索引擎 | -1 |
变现渠道 | 结合终端产品和自身的服务器产品,AI能很好落地 | 卷AI模型软件网络服务,落地到AI百度搜索/智能云2,硬件基础和销售弱一些 | -1.5 |
发展机遇 | 新部门开拓期,杭州和青浦定位相同,可选范围广 | 百度的核心AI业务的核心引擎部门 | 0 |
定级/晋升难易 | 特批的16级 | T4 | +0.5 |
部门团队 | 200人大部门 | 20人,较小独立的精致团队,便于团队内交流, 和领导也聊得来 | +1 |
师兄帮助 | 有同届的spq,还有lh师兄等师兄 | 唯一zpq师兄,还是在独立的昆仑芯 | -1 |
工作学习内容 | 华为摸索期,会有基础琐碎业务,参与到下一代昇腾, MindSpore(2020年3月)的研究 | 百度走在国内前沿, 学习了解飞桨平台(2016年8月底) | -1 |
毁约影响 | 没谈成之后也可以跳过来 | 毁约后很难再来 | +2 |
跳槽难度 | 不是传统互联网节奏 | 更适合在互联网企业流转 | +0.5 |
工作强度/节奏 | 8点半9点走,月末周六加班 | 七八点走 | +1 |
买房压力 | 青浦房价低,但是不适合定居 | 浦东房价高 | -1 |
生活通勤成本 | 便宜单人宿舍,应该离工作地点近, 食堂应该不错 | 住房成本和环境确实高一些 (+住房2k/month) | -1.5 |
周围配套(娱乐生活) | 偏远上海青浦,距陆家嘴/高铁站(2h+/1.5h) | 上海浦东,距陆家嘴/高铁站(42mins/1.25h) | +1 |
稳定性 | 两年较稳定期 | 全靠自己实力 | -1 |
工资 | 特批之后是同薪资(但基础工资的公积金差7% -3k) | 高薪 (n)*16 | +1 |
综合 | 专心的奋斗者,致敬 + 更长远的布局和共同成长 | 工作和快乐生活更平衡 + 接触工业界的前沿知识 | -0.5 |
工作内容:华为 昇腾计算开发使能部
- 调优体系工具Nsight(算子,网络训练分析
- 训练优化,精度提升(内存优化, 千卡万卡调度,通讯库
- 推理优化(AI算法强相关
- 算子体系(1. 编译器 TVM 2. 调试系统开发)
工作内容:百度 异构计算工程师
工作职责:
- 参与AI推理引擎底层算子库的开发与优化,提升异构资源计算效率
- 参与大规模AI计算通信库及通信算法的开发与优化,提升大规模AI训练效率
-
探索面向CPU/GPU/FPGA/ASIC等多元化计算架构的编译系统开发、实现编译优化和算法加速
-
完成其他相关任务
职位要求:
- 热爱编程,精通C++/Python
- 具有独立开发能力,对AI算法和流框架有丰富的应用或开发经验
- 熟悉GPU/ARM/MIPS/DSP等任意异构计算平台
- 熟悉计算机体系结构,有汇编级别开发经验
- 有丰富的AI通信加速经验,量化/融合/拓扑优化
- 熟悉MPI,对不同网络拓扑结构的通信算法及底层通信函数有深入研究,对RDMA,GPU direct等技术有了解
PS: 校招,社招,不限欢迎投递,部门团队直面,提前批招聘,不影响后续22届校招 欢迎投递,大量HC 校招特别说明: 校招生:基础扎实,有兴趣做AI底层计算加速与优化 即可
工作地距陆家嘴
上海房价:浦东和青浦
青浦房价最高到 3.8万左右。
浦东 7~8万。
BTW,华为东莞松山湖目前5-6万。
华为租房买房
华为选址规划:
- 华为在国内有深圳坂田、东莞松山湖、上海青浦3个总部级研发中心;
- 有9大一级研究所,分别是北京、上海、南京、西安、成都、杭州、苏州、武汉、长春(筹备中)。
青浦/西岑镇/淀山湖 规划:
- 长三角一体化: 2019年立项。华为全球研发中心,投资100亿,2020年开工2024年建成;
- 华为目前已经在那块建了大几千套家庭房和几千套单身公寓;合计约1.5万套房。6
- 所有金桥,市区其他办公大概20000多个华为研发,华为明年5月全部搬青浦华为中心
- 一共陆续要招5w人,
- 华为宿舍 :东莞松山湖和深圳坂田都有提供宿舍,一室一厅的话1600一个月,单间酒店那种的1300一个月。
- 华为住房:公司有自己盖的房子,有出租的,也有可以买的。出租的叫荔枝苑,无论级别都能住,但是要排队,房租2k到3k左右。买房的话,房价差不多1万-2万左右。
核心要点
真是两难的问题。其实秋招,我都没想到两边都这么重视,开的也比较高。看来工业界对于 AI System, HPC for AI或者说 HPC for LLM 有很大的期待。
前面的比较的点还是太繁琐了。抛开一点点工资和毁约的影响,选几个核心要点吧:
- 研究内容(现阶段):华为相较于百度,能参与到下一代昇腾的研究里去。作为体系结构科班,其实更感兴趣。
- 用武之地(上限):从体系结构的角度出发,如何为下一代AI的训练推理注入活力。华为昇腾覆盖的范围比百度更大。
- 过渡阶段(稳定性):作为个人,我其实是“转行”。百度虽然现阶段是领先的,但是我可能跟不上。华为这边体系结构的工作可以占比大,切入和适应应该更自然。
- 工作伙伴:有同届的spq,还有lh师兄等师兄。百度唯一zpq师兄,还是在独立的昆仑芯
- 工作节奏:工作压力时长,肯定是华为更大。但是工作的条件,环境。青浦修好后,肯定非常漂亮。
总体看来,选择华为更契合我未来的长远的职业规划。
后续毁约推进
- 如何与百度和解:我纠结了很久,百度也是很喜欢的团队和工作内容。但是在华为能参与到下一代昇腾的开发,这也是我学体系结构的梦想之一,(薪资也差不多)。
- 华为先签两方?4月再推进毁约?
公司资料了解
工资评级分析
华为的公司架构
- 三主体:产品线一线交付, 预研部门, 2012部门
- 产品线一线交付,付钱给预研部门, 2012部门来研究内容
- 前者在完成指标后,自负盈亏,后者一般是固定年终奖。
华为的公司公开的分红消息
根据公开的资料整理,华为历年的持股收益率,2019年以前,每年的分红综合收益率基本都在25%以上。
近几年即便是在美国的打压下,经营状况没那么好,分红略低一些,但也都在20%以上。
- 2020年,股价7.85元,分红1.86元,收益23.6%
- 2021年,股价7.85元,分红1.58元,收益20.1%
- 2022年,股价7.85元,分红1.61元,收益20.5%
总之,相当于投入100元,平均每年都能拿到25元左右的分红。
百度的参考资料
AI整体布局
飞桨布局
岗位与入职
校招与职业规划
电子市场分析?
To do :
- 分 C端、G端、B端分析
- 结合产业规模,
- 行业发展程度,当前状态(是否有瓶颈,还是需求端不足)。
计算机的经济价值在哪里?= 没有计算机会怎么样?
数字化的工作流能享受到摩尔定律的加速
"Once a technology becomes digital-that is,once it can be programmed in the ones and zeros of computer code-it hopes on the back of Moore's law and begins accelerating exponentially."
- Peter H.Diamandis Steven Kotler, The Future Is Faster Than You Think
- 自动化 (类似加减乘除计算器的各种程序,可以暴露api以黑盒的情况下快速给出准确结果或者推荐选项, 这里主要指利用计算机的计算能力)
- 开发难点:可用(基于特定算法,或者大数据喂给AI)、易用、好用(性能)。
- 没有明显先发优势,由于没有生态概念、迁移门槛低,客户只会选择好用、便宜和高性能的。
- 核心竞争力:软件如何实现 大规模,高并发,高利用率(算法,实际技巧)
- 便利性 (资源整合平台类似美团打车之类的,考验计算系统的数据库和网络,对应的低延迟,高并发)
- 开发难点:好用(快响应,低延迟),长期运维的稳定性
- 明显的先发优势:用户生态形成壁垒。参与对象越多、越好用、用户依赖程度越高。
- 核心竞争力:与人的交互的软件设计思路(飞书企业协作管理,集成了项目进度的allInOne极简模板平台),最全面的资源(美团最多的店家、高德最详细的地图、M站最多的种子数、B站最多泛二次元群体),稳定的运行,比用户需求高的快响应,低延迟性能。
- AI全面解放人类(具体指AI代替人做事情,解放人类,e.g., 机器人,自动驾驶,AI编程)
- 开发难点:当前AI必须有下面几点才能快速向AGI发展:
- 人类思考问题的正确逻辑链
- 基于已有的知识(世界模型),有识别输入知识的正确性的能力。
- 这样基于正确的知识的正确的推导,才能形成正确的结果。乃至真理(
毁灭人类是必须的)。并在计算机的高速无休止运行下快速成长。 - 也就是说AGI要有明显的人格特质,不是指说话的语气,而是AGI的每个观点要是经过思考达到和谐平衡的结果。当然不排除思考过程中死循环的事情,比如先有鸡还是先有蛋。
- 当前AI,只能接受数据集的知识,没有自我思考并选择的过程
- 核心竞争力:支持AGI的计算系统是什么样子的呢?
- 抽象来思考:计算、访存、网络是三部分基石。类似人形机器人的设计。计算单元来实现大量内存记忆数据的读取 和 网络实时交互学习信息的 过滤思考
- 性能指标:低延迟,高吞吐。
- 计算单元:针对思考过程的特殊操作设计,数学推导关系的实现?集合论?是非关系?这种场景下还需要GPU的这么多核并发吗?
- 内存要考虑的是存算一体的可能性?不然就是吞吐和延迟
Costume 端 特有的:
- 内容生产(AIGC)
- 开发难点:达到人类审美的AI内容
- 没有明显的先发优势, 生成内容的风格会筛选用户。
- 核心竞争力:支持的生成方面广(生成内容的风格需要能定制化),内容质量高,速度快。
- 文娱产业(电子游戏,视频内容)
- 开发难点:丰富的游戏细节,和与时俱进的美术。
- 没有明显的先发优势, 游戏内容的精度和新鲜感是最重要的。
- 核心竞争力:如何实现工业化的高级美术和剧情产出(AIGC?)。
计算机行业为什么赚钱? 这个理由能持续下去吗?
- 门槛低,一台笔记本就可以写软件,从便利的各种小工具,到大型软件。
- 在专利保护下软件复制成本近乎零,收益稳定。可以实现薄利多销。
- 低成本复用性:一个APP开发好之后,可以在不同位置和时间无成本复制(指每个人可以在任意时刻使用软件服务)。 第一产业生产的粮食和工业制品都是生产一个消耗一个。服务业也是一次性的。
- 无损耗,实现后可以长期生效。是少数跨越时间长河的永恒的东西。
- 但是在激烈的竞争下,软件都趋向免费化。靠基于庞大用户群体的平台抽成和附加高级服务(云盘会员,游戏附加充值)来实现。或者是靠免费化吸引一波用户。
- 芯片硬件流片周期长,成本高
参考文献
GDB
GDB 基本命令
命令 | 描述 |
---|---|
next |
单步执行 |
step |
单步进入 |
finish or fin |
跳出当前函数 |
continue |
继续执行到下一个断点 |
until |
继续运行到指定位置 |
- 跳出当前函数
finish
: Continue running until just after function in the selected stack frame returns. Print the returned value (if any).
运行带参数程序
gdb --args 正常程序+参数
- 进入gdb后运行
set args 参数
break断点
f
打印当前文件 ,便于打断点info breakpoints
查看已经的断点del 3
删除NUM=3的第三个断点
给某个结构体内的函数全部上break
打印信息
- 参数
show args
- 局部变量
info locals
- 修改变量
p result=20
- 函数调用栈
bt
多线程
info threads
- 切换线程
thread 2
- 打印线程堆栈
thread apply all bt
代码信息
结构体class
gef➤ p -raw-values off -- this->TotalCycles
gef➤ p this
$11 = (llvm::mca::SummaryView * const) 0x7fffffffcc08
gef➤ p *this
指针变量
- 二维指针
p **matrix@3@3
- 一维指针
p *matrix@3
- 或者转换为数组
p *(int *)matrix@3
- 或者转换为数组
p *(int (*)[3])matrix
数组
可以看到打印了array
数组第60~69个元素的值。如果要打印从数组开头连续元素的值,也可使用这个命令:“p *array@num
”:
内存地址内容
examine 命令(简写是 x)
格式:x /nfu <addr>
说明:
x
是 examine 的缩写。n
表示要显示的内存单元的个数。f
表示显示方式,可取如下值:
显示方式 | 描述 |
---|---|
x |
按十六进制格式显示变量。 |
d |
按十进制格式显示变量。 |
u |
按无符号整型格式显示变量。 |
o |
按八进制格式显示变量。 |
t |
按二进制格式显示变量。 |
a |
按十六进制格式显示变量。 |
i |
指令地址格式。 |
c |
按字符格式显示变量。 |
f |
按浮点数格式显示变量。 |
u
表示一个地址单元的长度,长度类型如下:
类型 | 描述 |
---|---|
b |
单字节 |
h |
双字节 |
w |
四字节 |
g |
八字节 |
example:
(gdb) x 0x8049948
0x8049948: 0x20726f46
(gdb) x/s 0x8049948
0x8049948: "For NASA,space is still a high priority."
(gdb) x/4 0x7fffe536dbc0 # display 4 bytes info?
0x7fffe536dbc0: 0x0 0x0 0x9d835 0x0
打印寄存器值(表格)
GDB segmentation fault
段错误定位
# ulimit -c 显示核心转储文件大小的最大值
ulimit -c unlimited # 打开
ulimit -c 0 # 关闭
# 改变core存储位置
#%e 打印线程name
#%p 打印进程id
#%h 打印主机名
#%t 打印时间
echo '/tmp/core-%e.%p.%h.%t' > /proc/sys/kernel/core_pattern
c++程序
- 执行编译加入-g的SLIC程序,产生core文件
- 然后执行进gdb
(gdb) bt #0 0x00002af6047e4a4b in fgets () from /lib64/libc.so.6 #1 0x000000000040450a in LoadPPM (filename=0x407e63 "input_image.ppm", data=0x7ffecda55cc8, width=0x7ffecda55cc4, height=0x7ffecda55cc0) at SLIC_raw.cpp:692 #2 0x00000000004049e1 in main (argc=1, argv=0x7ffecda55de8) at SLIC_raw.cpp:794
python 程序
问题
define内容难以解析
gef 界面
效果
会打印详细的信息
安装gef
需要GDB10以上
bash -c "$(curl -fsSL http://gef.blah.cat/sh)"
# 没有网,手动下 https://gef.blah.cat/py ,替换
$ wget -O ~/.gdbinit-gef.py -q https://gef.blah.cat/py
$ echo source ~/.gdbinit-gef.py >> ~/.gdbinit
注意:gdbtui 与 gef 不太兼容
开题缘由、总结、反思、吐槽~~
参考文献
Wake Up Process
Linux 多进程的竞争休眠机制
基本是基于Linux的时间片轮转机制。A process/thread is woken up by inserting it in the queue of processes/threads to be scheduled.
内核调度算法
CFS(Completely Fair Scheduler)是一种用于 Linux 操作系统的调度算法,它旨在实现对 CPU 时间的公平分配。CFS 是 Linux 内核中默认的调度器,自 Linux 2.6.23 版本以来就成为了标准调度器。
CFS 调度算法的主要目标是确保各个任务在相同的时间片内能够获得公平的CPU时间,不会因为优先级等因素而造成资源争夺不均。以下是 CFS 调度算法的一些关键特点和原则:
-
虚拟化时钟: CFS 使用了一种称为虚拟化时钟(virtual runtime)的概念,而不是传统的时间片。每个任务都有一个虚拟运行时间,调度器根据虚拟运行时间来决定哪个任务应该被调度。
-
权重: CFS 引入了权重的概念,用于调整不同任务的相对优先级。较高权重的任务会在相同时间间隔内获得更多的虚拟运行时间,从而实现按比例分配CPU资源。
-
累积虚拟运行时间: 调度器会根据每个任务的权重和已累积的虚拟运行时间,计算出每个任务的应有的虚拟运行时间片。任务在使用完它的时间片后,会根据虚拟运行时间进行重新排队。
-
红黑树结构: CFS 使用红黑树来管理任务队列,这种数据结构使得在插入、删除和搜索任务时的时间复杂度保持在对数级别。
除了 CFS,Linux 内核还有其他调度算法,如:
-
实时调度器(Real-Time Scheduler): 用于实时任务,提供硬实时和软实时的调度策略,确保实时任务在指定的时间内执行完成。
-
O(1) 调度器(O(1) Scheduler): 是 Linux 2.4 内核中使用的调度器,它的时间复杂度为常数级别。然而,随着多核系统的出现,O(1) 调度器在多核环境下的性能表现受到限制,因此被 CFS 替代。
这些调度算法在不同的场景和需求下,对于多任务操作系统的调度提供了不同的方法和策略。选择适合的调度算法可以根据系统的应用和性能要求来进行。
问题
在高强度竞争之后,有些进程陷入长期sleep,并且在核空闲的时候,也不再重新运行?为什么?
原因可能是程序逻辑阻塞了,或者在等待IO
查看进程Sleep的原因
首先 计算机对一个进程是如何判断sleep的,是某时间内的计算占比低于某个阈值吗?
htop s
可以查看kernel 是不是阻塞, l
可以查看是不是读写同一个文件导致阻塞了。
Sleep的瓶颈在哪里
sleep for what, waiting for what?
实践1 strace
strace -p PID
可以显示一些信息
$ strace -p 4005042
wait4(-1, # 等待任意子进程结束
# check subprocess
$ pstree -p 4005042
pinbin(4005042)---BC_Compute(4005082)-+-{BC_Compute}(4005187)
|-{BC_Compute}(4005188)
|-{BC_Compute}(4005252)
|-{BC_Compute}(4005296)
|-{BC_Compute}(4005299)
`-{BC_Compute}(4005302)
$ strace -p 4005082
strace: Process 4005082 attached
futex(0x7fffe52de1b8, FUTEX_WAIT, 2, NULL
# futex - fast user-space locking(seems to be used in OpenMP)
# It is typically used as a blocking construct in the context of shared-memory synchronization.
$ strace -p 4005188
nanosleep({tv_sec=0, tv_nsec=2000000}, 0x7fffe5368bc0) = 0 # repeat
nanosleep({tv_sec=0, tv_nsec=2000000}, 0x7fffe536dbc0) = 0
It seems this is a subprocess repeating sleep leading to all other process to wait in the synchronization.
Use gdb -p PID
to attach the process to locate the infinite loop (need Debug Symbols).
futex解释
futex
是 Linux 下的一个系统调用,用于实现用户空间线程间的同步和通信。让我们逐个解释这个系统调用中的每个参数的含义:
0x7fffe52de1b8
: 这是一个指向内存地址的指针(或称为地址),通常是用于表示需要同步的资源或变量的地址。在这里,它表示需要等待的共享资源或变量的地址。FUTEX_WAIT
: 这是一个指定 futex 要执行的操作的标志。FUTEX_WAIT
表示线程正在等待 futex 的值发生变化,即等待条件满足。当某个线程执行FUTEX_WAIT
操作时,如果 futex 的值与预期不符,则该线程将被置于休眠状态,直到 futex 的值发生变化或超时。2
: 这是一个表示期望的 futex 值的参数。当调用FUTEX_WAIT
时,线程将检查 futex 的当前值是否等于此参数指定的值。如果不等于,则线程将休眠等待。NULL
: 这是一个指向 timespec 结构的指针,用于设置超时。这里为NULL
表示调用没有设置超时,即线程将一直等待,直到 futex 的值发生变化。
总的来说,futex(0x7fffe52de1b8, FUTEX_WAIT, 2, NULL)
表示线程正在等待位于内存地址 0x7fffe52de1b8
的 futex 变量的值等于 2。如果 futex 的值不是 2,则线程将一直等待直到 futex 的值变为 2 或者超时。这样的同步机制在多线程编程中用于等待条件满足后再执行某些操作,从而避免资源竞争和提高程序的并发性能。
nanosleep解释
这是一个系统调用 nanosleep
的输出,通常用于让线程休眠一段时间。让我们逐个解释这个系统调用的含义:
-
nanosleep
: 这是 Linux 下的一个系统调用,用于使线程休眠一段指定的时间。 -
{tv_sec=0, tv_nsec=2000000}
: 这是传递给nanosleep
的第一个参数,是一个指向timespec
结构的指针。timespec
结构用于表示时间间隔,包括秒(tv_sec
)和纳秒(tv_nsec
)。
在这里,tv_sec=0
表示秒数为 0,tv_nsec=2000000
表示纳秒数为 2000000。因此,这个 nanosleep
调用将会使线程休眠 2 毫秒(1 秒 = 1000000000 纳秒,所以 2000000 纳秒就是 2 毫秒)。
-
0x7fffe5368bc0
: 这是传递给nanosleep
的第二个参数,表示一个timespec
结构的指针。这个参数用于存放未休眠完成的剩余时间,如果nanosleep
被中断(例如收到信号),它将在这个指针中返回剩余的时间。在这个输出中,剩余时间被存储在内存地址0x7fffe5368bc0
处。 -
= 0
: 这是nanosleep
的返回值,表示成功完成。返回值为 0 表示nanosleep
成功休眠了指定的时间。
综上所述,这个输出表示线程成功休眠了 2 毫秒。
实践2: zsim模拟程序
程序直接执行正常,zsim模拟直接sleep?
$ strace -p 303359
read(10,
$ pstree -p 303359 │
gups_vanilla(303359)-+-gups_vanilla(303449)-+-orted+ │
| `-{gups+ │
|-{gups_vanilla}(303360) │
|-{gups_vanilla}(303361)
$ pstree -p 303449 │
gups_vanilla(303449)-+-orted(303451)-+-{orted}(303452) │
| |-{orted}(303642) │
| |-{orted}(303643) │
| `-{orted}(303644) │
`-{gups_vanilla}(303450)
这是一个 Open MPI(Message Passing Interface)的启动命令,用于启动一个 MPI 程序,并配置一些运行时参数。让我们逐个解释这个命令中的每个选项和参数的含义:
orted --hnp --set-sid --report-uri 11 --singleton-died-pipe 12 -mca state_novm_select 1 -mca ess hnp -mca pmix ^s1,s2,cray,isolated
部分参数含义如下:
orted
: 这是 Open MPI 的一个工具,用于启动和管理 MPI 进程。-mca state_novm_select 1
: 这是一个 MCA(Modular Component Architecture)选项,用于指定某个模块或组件的参数设置。在这里,state_novm_select
设置为 1,可能是指定某个组件或模块在运行时的选项。-mca pmix ^s1,s2,cray,isolated
: 这是另一个 MCA 选项,用于配置 PMIx(Process Management Interface for Exascale)的相关设置。^s1,s2,cray,isolated
表示排除 s1、s2、cray 和 isolated 这些模块,可能是禁用某些特定的组件或功能。
pid | strace output | explanation |
---|---|---|
303451 | restart_syscall(<... resuming interrupted read ...> | |
303452 | futex(0xabba001ec8, FUTEX_WAIT, 2, NULL | |
303642 | epoll_wait(18, ... | epoll_wait 系统调用,用于等待文件描述符18上的事件 |
303643 | select(50, [48 49], NULL, NULL, | 如下 |
303644 | select(53, [51 52], NULL, NULL, |
restart_syscall
表示系统调用被中断后重新启动的过程。它通常出现在系统调用的执行过程中,当某个信号(例如 SIGSTOP 或 SIGCONT)中断了系统调用的执行,然后系统调用在信号处理完成后被重新启动。- select 是一个用于在多个文件描述符上进行 I/O 多路复用(I/O multiplexing)的系统调用,它可以监视多个文件描述符,并在其中任何一个文件描述符准备好进行 I/O 操作时返回。
- select 调用的输出,它将监视文件描述符 48 和 49,并在其中任何一个文件描述符准备好读取数据或超时(2 秒后)时返回。
- 完全无法理解呢! 可能需要深入了解MPI的实现栈细节才能明白。
命令行唤醒Sleep进程
The only way to “wake it up” is to arrange for the condition to be met. 用户是无法更改的状态的。
传统kill进程
需要进一步的研究学习
暂无
遇到的问题
暂无
开题缘由、总结、反思、吐槽~~
参考文献
上面回答部分来自ChatGPT-3.5,没有进行正确性的交叉校验。
无
Overview of Compute system
“Those who cannot remember the past are condemned to repeat it.” —George Santayana, 1905
"Our technology,our machines,is part of our humanity.We created them to extend ourself,and that is what is unique about human beings. - Ray Kurzweil
Script: Email notifications when machine is free
outline
login to free SMTP server(qq, google) to send email to others.
send email using command line
- check
ping mail.ustc.edu.cn
- MUST : set gmail open to support SMTP and apppassword
- or config qq email
IMAP, POP3 or SMTP
mailutils
According to ref1.
sudo apt-get install mailutils
$ echo "Hello world" | mail -s "Test" [email protected]
send but the same, more crazy thing is the -v
and -d
flag is not supported. and --debug-level=trace0
isn't recognized. many same question in StackOverflow
sudo tail -n 30 /var/log/mail.log
or mail.error
show more info.
ssmtp
We try ref2 ssmtp
, sudo vim /etc/ssmtp/ssmtp.conf
TLS_CA_FILE=/etc/pki/tls/certs/ca-bundle.crt
root=[email protected]
mailhub=smtp.gmail.com:587
rewriteDomain=gmail.com
AuthUser=shaojieemail
AuthPass={apppassword}
FromLineOverride=YES
UseSTARTTLS=Yes
UseTLS=YES
hostname=snode6
The config get work but not well configed, e.g., TLS_CA_FILE
sending a email using gmail took about 13 mins.
$ ssmtp 943648187@qq.com < mail.txt
......
[->] Received: by snode6 (sSMTP sendmail emulation); Wed, 06 Sep 2023 15:42:05 +0800
[->] From: "Shaojie Tan" <[email protected]>
[->] Date: Wed, 06 Sep 2023 15:42:05 +0800
[->] test server email sending
[->]
[->] .
[<-] 250 2.0.0 OK 1693986323 5-20020a17090a1a4500b0026b4ca7f62csm11149314pjl.39 - gsmtp
[->] QUIT
[<-] 221 2.0.0 closing connection 5-20020a17090a1a4500b0026b4ca7f62csm11149314pjl.39 - gsmtp
sendmail
$ sendmail [email protected] < mail.txt
sendmail: Authorization failed (535 5.7.8 https://support.google.com/mail/?p=BadCredentials e7-20020a170902b78700b001c0c79b386esm8725297pls.95 - gsmtp)
get to work after well config gmail setting.
Speed Compare
command | snode6 time(mins) | icarus1 |
---|---|---|
4 | 1s | |
ssmtp | 13 | |
sendmail | 6 |
send email by python
ref using QQ apppassword and python.
email notifications
- Create a Bash Script: Create a Bash script that checks the CPU usage and sends an email if it's below 30%. For example, create a file named
cpu_check.sh
:
#!/bin/bash
# Get CPU usage percentage
cpu_usage=$(top -b -n 1 | grep '%Cpu(s):' | awk '{print $2}' | cut -d'.' -f1)
echo "cpu_usage : ${cpu_usage} on $(hostname)"
# Check if CPU usage is below 30%
if [ "$cpu_usage" -lt 30 ]; then
echo "beyond threshold : ${cpu_usage} on "
# Send an email
echo "CPU usage is ${cpu_usage} below 30% on $(hostname)" | mail -s "Low CPU Usage Alert on $(hostname)" [email protected]
fi
Make the script executable:
Modify [email protected]
with your actual email address.
- Schedule the Script: Use the
cron
scheduler to run the script at regular intervals. Edit your crontab by running:
Add an entry to run the script, for example, every 5 minutes:
*/5 * * * * /staff/shaojiemike/test/cpu_check.sh >> /staff/shaojiemike/test/cpu_check.log
# Run every 15 minutes during working hours (9 am to 7 pm)
*/15 9-19 * * * /path/to/your/script.sh
Replace /path/to/cpu_check.sh
with the actual path to your Bash script.
- Save and Exit: Save the crontab file and exit the text editor.
Now, the script will run every 5 minutes (adjust the cron schedule as needed) and send an email notification if the CPU usage is below 50%. You should receive an email when the condition is met.
Please note that this is a basic example, and you can modify the script to include more details or customize the notification further as needed. Additionally, ensure that your server is configured to send emails; you may need to configure SMTP settings for the mail
or sendmail
command to work correctly.
需要进一步的研究学习
暂无
遇到的问题
暂无
开题缘由、总结、反思、吐槽~~
参考文献
上面回答部分来自ChatGPT-3.5,没有进行正确性的交叉校验。
无
Conda
conda
Anaconda和Miniconda都是针对数据科学和机器学习领域的Python发行版本,它们包含了许多常用的数据科学包和工具,使得安装和管理这些包变得更加简单。
解决了几个痛点:
- 不同python环境的切换(类似VirtualEnv)
- 高效的包管理工具(类似pip,特别是在Windows上好用)
anaconda
Anaconda是一个全功能的Python发行版本,由Anaconda, Inc.(前称Continuum Analytics)提供。
- 它包含了Python解释器以及大量常用的数据科学、机器学习和科学计算的第三方库和工具,如NumPy、Pandas、Matplotlib、SciPy等。
- Anaconda还包含一个名为Conda的包管理器,用于安装、更新和管理这些库及其依赖项。
- Anaconda发行版通常较大(500MB),因为它预装了许多常用的包,适用于不希望从头开始搭建环境的用户。
Miniconda
Miniconda是Anaconda的轻量级版本(50MB),它也由Anaconda, Inc.提供。
- 与Anaconda不同,Miniconda只包含了Python解释器和Conda包管理器,没有预装任何其他包。这意味着用户可以根据自己的需求手动选择要安装的包,从而实现一个精简而高度定制化的Python环境。
- 对于希望从零开始构建数据科学环境或需要更细粒度控制的用户,Miniconda是一个很好的选择。
Install miniconda
According to the official website,
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
bash Miniconda3-latest-Linux-x86_64.sh
# choose local path to install, maybe ~/.local
# init = yes, will auto modified the .zshrc to add the miniconda to PATH
# If you'd prefer that conda's base environment not be activated on startup,
# set the auto_activate_base parameter to false:
conda config --set auto_activate_base false
you need to close all terminal(all windows in one section including all split windows), and reopen a terminal will take effect;
Python on windows1
换源
超时报错:CondaHTTPError: HTTP 000 CONNECTION FAILED for url <https://repo.anaconda.com/pkgs/main/linux-64/repodata.json>
面对如下报错
> conda create -n opensora-t00906153 python=3.8 -y
Channels:
- defaults
Platform: linux-64
Collecting package metadata (repodata.json): failed
CondaHTTPError: HTTP 000 CONNECTION FAILED for url <https://repo.anaconda.com/pkgs/main/linux-64/repodata.json>
Elapsed: -
An HTTP error occurred when trying to retrieve this URL.
HTTP errors are often intermittent, and a simple retry will get you on your way.
If your current network has https://repo.anaconda.com blocked, please file
a support request with your network engineering team.
'https//repo.anaconda.com/pkgs/main/linux-64'
修改~/.condarc
ssl_verify: true
show_channel_urls: true
channels:
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
- conda-forge
如果还是有超时错误,多半是下载多了被拦截
通过 curl -v http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
检查是不是请求被阻拦了。
可以换成科大源或者default 源。
创建与激活
# 激活环境(base),路径为指定的 conda 安装路径下的 `bin/activate` 文件
source /home/m00876805/anaconda3/bin/activate
# 或者 conda init zsh
# 使用以下命令创建一个名为"myenv"的虚拟环境(您可以将"myenv"替换为您喜欢的环境名称):
conda create --name myenv python=3.8
# list existed env
conda env list
/home/m00876805/anaconda3/bin/conda env list
# 查看具体环境的详细信息
conda env export --name <env_name>
# 激活,退出
conda activate name
conda deactivate name
conda pack
- 目的:
conda pack
用于将现有的 Conda 环境打包成一个压缩文件(如.tar.gz
),便于在其他系统上分发和安装。 - 打包内容: 打包的内容包括环境中的所有依赖、库和包(定制修改包),通常用于在不使用 Anaconda 或 Miniconda 的系统上还原环境。
- 恢复方式: 打包后的环境可以解压缩到指定位置,之后运行
conda-unpack
来修复路径,使其在新环境中正常工作。
打包
conda-pack
可以将 Conda 环境打包成一个 .tar.gz
文件,以便于跨机器或系统移动和还原环境。以下是使用 conda-pack
打包和还原环境的步骤:
1. 打包环境
假设要打包的环境名为 my_env
:
这会在当前目录生成一个 my_env.tar.gz
文件。你可以将这个文件复制到其他系统或机器上解压还原。
2. 还原环境
在一个特定的 conda
环境目录(例如 /home/anaconda3
)下还原和激活打包的环境,可以按以下步骤操作:
假设场景
- 目标
conda
激活路径:/home/anaconda3/bin/activate
- 打包文件:
my_env.tar.gz
- 解压后的环境名称:
my_env
步骤
- 解压文件到
conda
环境目录
首先,将打包文件解压到指定的 conda
环境目录下的 envs
目录:
mkdir -p /home/anaconda3/envs/my_env
tar -xzf my_env.tar.gz -C /home/anaconda3/envs/my_env --strip-components 1
这里的 --strip-components 1
会去掉 tar.gz
包中的顶层目录结构,使内容直接解压到 my_env
文件夹内。
- 激活并修复环境
激活该环境,并运行 conda-unpack
来修复路径:
现在,my_env
环境已在 /home/anaconda3
目录下的 envs
文件夹中完成还原,可以正常使用。
conda env export
- 目的:
conda env export > freeze.yml
用于导出当前 Conda 环境的配置,包括所有安装的包和它们的版本信息,以 YAML 格式保存。 - 导出内容: 导出的内容主要是依赖项和版本号,而不包括包的实际二进制文件。适用于在相同或不同系统上重建环境。
- 恢复方式: 使用
conda env create -f freeze.yml
可以根据导出的 YAML 文件创建一个新环境。
conda list -e > requirements.txt 和 conda env export > freeze.yml
conda list -e > requirements.txt
和 conda env export > freeze.yml
都是用于记录和管理 Conda 环境中安装的包,但它们之间有一些关键的区别:
conda list -e
- 用途: 这个命令生成一个以简单文本格式列出当前环境中所有包及其版本的文件(
requirements.txt
)。 - 内容: 列出的内容通常仅包括包的名称和版本,而不包含环境的依赖关系、渠道等信息。
- 安装方式: 通过
conda install --yes --file requirements.txt
可以尝试使用 Conda 安装这些列出的包。这种方式适合简单的包管理,但可能在处理复杂依赖时存在问题。
conda env export
- 用途: 这个命令生成一个 YAML 文件(
freeze.yml
),它包含了当前环境的完整配置,包括所有包、版本、渠道等信息。 - 内容: 导出的 YAML 文件包含了完整的依赖关系树,可以确保在重建环境时完全匹配原始环境的状态。
- 安装方式: 通过
conda env create -f freeze.yml
可以根据 YAML 文件创建一个新的环境,确保与原环境一致。
关系与总结
- 复杂性:
conda env export
更加全面和可靠,适合重建相同的环境;而conda list -e
更简单,适合快速记录包。 - 使用场景: 对于需要准确重建环境的情况,使用
freeze.yml
是更好的选择;而对于简单的包列表管理,requirements.txt
可能足够用。
因此,如果你的目标是确保环境的一致性,使用 conda env export
和 freeze.yml
是推荐的做法;如果只是想快速记录并安装一组包,requirements.txt
是一个方便的选择。
安装
在conda命令无效时使用pip命令来代替
while read requirement; do conda install --yes $requirement || pip install $requirement; done < requirements.txt
The double pipe (“||
”) is a control operator that represents the logical OR operation. It is used to execute a command or series of commands only if the previous command or pipeline has failed or has returned a non-zero status code.
复制已有环境(fork)
conda create -n 新环境名称 --clone 原环境名称 --copy
虽然是完全复制,但是pip install -e
安装的包会因为源文件的改动而失效
pip install -e 是用于在开发模式下安装 Python 包的命令,允许你在不复制包文件的情况下,将项目源代码直接安装到 Python 环境中,并保持源代码与环境中的包同步更新。这对于开发过程中频繁修改和测试代码非常有用。
以下是 pip install -e 的使用方法:pip install -e /path/to/project
详细解释:
- /path/to/project:项目的根目录,通常包含 setup.py 文件。setup.py 文件定义了包的名称、依赖、入口点等信息。
- -e 选项:表示“可编辑安装”(editable),意味着它不会复制项目文件到 Python 环境的 site-packages 目录,而是创建一个符号链接,指向原始项目路径。这样你可以在原路径下修改源代码,Python 环境中的包会实时反映这些修改。
通过 pip freeze 命令更好地查看
- 通过
pip freeze
命令更好地查看:
如果你想明确区分哪些包是通过 pip install -e
安装的,可以使用 pip freeze
命令。与 pip list
不同,pip freeze
会将包的版本和安装源显示出来。对于 -e
(editable mode)安装的包,pip freeze
会有特殊标记。
运行以下命令:
输出示例:
在这里,带有 -e
标记的行表示这个包是通过 pip install -e
安装的,后面跟的是包的源代码路径(例如 Git 仓库 URL 或本地路径),而不是直接列出包的版本号。
-
输出解析:
-
-e
标记:表示这个包是以开发模式安装的。 - 普通包:对于直接通过
pip install
安装的包(不是开发模式),它们会以包名==版本号
的形式列出。 git
URL 或本地路径:开发模式下安装的包会指向源代码的路径,通常是git
仓库 URL 或本地路径(如果是通过本地文件系统安装的)。
参考文献
Linux Terminal
导言
对程序员来说,一个好用、易用的terminal,就是和军人手上有把顺手的好枪一样。
基础知识
用户的环境变量和配置文件
在Linux系统中,用户的环境变量和配置文件可以在不同的节点生效。以下是这些文件的功能和它们生效的时机:
-
/etc/environment
:- 功能: 设置系统范围的环境变量。
- 生效时机: 在用户登录时读取,但不会执行shell命令。它主要用于设置变量,如PATH、LANG等。
-
/etc/profile
:- 功能: 为系统的每个用户设置环境信息。
- 生效时机: 当用户登录时,会读取并执行该文件中的配置。它是针对登录shell(例如,通过终端登录或ssh登录)的。
-
/etc/profile.d/
:- 功能: 存放多个脚本,这些脚本会被
/etc/profile
读取和执行。 - 生效时机: 与
/etc/profile
相同,登录shell时执行。它使得系统管理员可以将不同的配置分散到多个文件中管理。
- 功能: 存放多个脚本,这些脚本会被
-
/etc/bash.bashrc
:- 功能: 为所有用户设置bash shell的配置。
- 生效时机: 对于非登录shell(例如,打开一个新的终端窗口)时会读取并执行。
-
~/.profile
:- 功能: 为单个用户设置环境信息。
- 生效时机: 用户登录时读取并执行,主要针对登录shell。
-
~/.bashrc
:- 功能: 为单个用户配置bash shell的设置。
- 生效时机: 用户打开一个新的bash shell(非登录shell)时读取并执行。
总结:
/etc/environment
和/etc/profile
主要用于系统范围的环境变量设置,前者不会执行shell命令,后者会执行。/etc/profile.d/
中的脚本作为/etc/profile
的扩展,用于更灵活的管理配置。/etc/bash.bashrc
适用于所有用户的bash配置,但只针对非登录shell。~/.profile
和~/.bashrc
适用于单个用户,前者用于登录shell,后者用于非登录shell。
通过这些文件,系统和用户可以灵活地设置和管理环境变量和shell配置,以满足不同的需求和使用场景。
\n \r 回车 换行
符号 | ASCII码 | 意义 |
---|---|---|
\n | 10 | 换行NL: 本义是光标往下一行(不一定到下一行行首),n的英文newline,控制字符可以写成LF,即Line Feed |
\r | 13 | 回车CR: 本义是光标重新回到本行开头,r的英文return,控制字符可以写成CR,即Carriage Return |
在不同的操作系统这几个字符表现不同:
- 在WIN系统下,这两个字符就是表现的本义,
- 在UNIX类系统,换行\n就表现为光标下一行并回到行首,
- 在MAC上,\r就表现为回到本行开头并往下一行,至于ENTER键的定义是与操作系统有关的。通常用的Enter是两个加起来。
终端命令行代理
在任意层级的SHELL配置文件里添加
写成bashrc的脚本命令
#YJH proxy
export proxy_addr=localhost
export proxy_http_port=7890
export proxy_socks_port=7890
function set_proxy() {
export http_proxy=http://$proxy_addr:$proxy_http_port #如果使用git 不行,这两个http和https改成socks5就行
export https_proxy=http://$proxy_addr:$proxy_http_port
export all_proxy=socks5://$proxy_addr:$proxy_socks_port
export no_proxy=127.0.0.1,.huawei.com,localhost,local,.local
}
function unset_proxy() {
unset http_proxy
unset https_proxy
unset all_proxy
}
function test_proxy() {
curl -v -x http://$proxy_addr:$proxy_http_port https://www.google.com | egrep 'HTTP/(2|1.1) 200'
# socks5h://$proxy_addr:$proxy_socks_port
}
# set_proxy # 如果要登陆时默认启用代理则取消注释这句
常用命令
check process create time
kill all process by name
常见问题
鼠标滚轮输出乱码
滚轮乱码,是tmux set mouse on
的原因
进入tmux后退出,并运行reset
即可
sudo后找不到命令
当你使用sudo去执行一个程序时,处于安全的考虑,这个程序将在一个新的、最小化的环境中执行,也就是说,诸如PATH这样的环境变量,在sudo命令下已经被重置成默认状态了。
添加所需要的路径(如 /usr/local/bin
)到/etc/sudoers
文件"secure_path"下
在用python使用curses写多进程进度条的时候,混乱输出
解决办法如下: