python中的print()函数深度使用

背景 今天读代码的过程中发现了一种很有意思的print()写法 每一个程序员对每一种语言最熟悉的不过于各种“hello world”,这也不可避免的造成了我们对最熟悉的print()语句最为“陌生” 主题 对于python中print()函数的参数深度使用方法 语法 print(*values, [sep="", end="", file="", flush=""]) 参数 *values 必需 要输出的内容,可以是任何类型对象 同时输出多个对象时,需要用,隔开 sep 可选 同时输出多个对象时的分隔符 默认空格 end 可选 输出最后一个对象之后的结尾符 默认是一个\n,即换行 file 可选 要打印输出到的“设备” 默认为输出到当前终端,可以指定已打开的文件对象 对文件是否追加更新由上下文的open()中的a/w参数指定 flush 可选 整成情况下输出是否被缓存(是否等待文件对象关闭前同一写入)由file对象决定,但如果指定为Ture则print()会强制立即将内容刷新进文件 一般用不到
Read more →

Pytorch使用单机多卡训练

需求 对基于pytorch的深度学习模型进行多卡训练以加速训练过程 由于显卡版本过于老旧,安装配置NCCL工程量过于庞大,希望使用简单的pytorch代码实现单机多卡训练,不考虑多机多卡的显卡通信 训练完成后保存的checkpoint需要能够在任何设备上进行加载、推理 实现 训练 pytorch提供了简单的单机多卡训练api,只需要在初始化模型之后执行下列语句将模型复制到多卡上 # initiate multi-gpu training model = nn.DataParallel(model, device_ids=<ids of the gpus you want to use>) 其他操作与单卡训练完全一致 加载checkpoint 上述操作后保存的checkpoint如果按照常规方法直接进行加载会报错 RuntimeError: Error(s) in loading state_dict for <ModelName>: Missing key(s) in state_dict:... debug遍历后发现其实其状态字典是完全一致的,只是因为我们在训练过程中将模型定义为了多卡并行模型。这里只需要按照训练过程中转换为多卡模型的代码初始化当前模型结构即可,即执行: # initiate multi-gpu training model = nn.DataParallel(model, device_ids=<ids of the gpus you want to use>) 其他操作与征程推理完全一致,若不想使用多卡/只想使用cpu,只需要按照常规将device = torch.device("<cpu/cuda:id>")即可 Note:查阅资料过程中发现有解答建议使用参数强行忽略模型加载的错误torch.load(<checkpoint>, strict=False),经测试,这样加载的模型啥也不是…不知道为什么pytorch官方要提供这个接口
Read more →

Pytorch单机多卡(DP)训练之后的模型“货不对板”

背景 之前介绍过Pytoch的单机多卡训练,当时采用的是内置的nn.DataParallel()方法 经过单机多卡训练的模型保存checkpoint之后再次加载需要同样使用DP()对模型进行封装之后才能正常加载,否则会报错状态词典的键值对不上 原因 经过DP()封装之后的模型,其状态词典分别添加了module.的前缀,例如原参数为hr_branch.conv_hr.1.layers.0.weight,封装之后变成了module.hr_branch.conv_hr.1.layers.0.weight。 解决方案 在加载状态词典之前将该前缀进行替换,得到纯净的状态词典,则不再需要重新对模型进行DP()封装 ckp_state_dict = torch.load(args.ckp, map_location=torch.device("cpu"))["model"] ckp_state = {} for k, v in ckp_state_dict.items(): k = k.replace("module.", "") ckp_state[k] = v 参考 文章
Read more →

Treafik反代保姆级急速上手

需求场景 所有需要反代的场景 服务器上部署了太多的docker、frp映射等服务,每个服务都占用着各自的端口,多的以至于为了记忆这些服务端口我专门要维护一个记事本… 什么是Treafik Traefik是一个开源的可以使得服务发布变得轻松有趣的 边缘路由器。它负责接收你系统的请求,然后使用合适的组件来对这些请求进行处理 Treafik可以自适应并动态自动发现你添加的所有服务、容器等等 Treafik适配了当前主流的所有服务技术(docker, k8s…),这意味着你可以一次配置,终生动态,非常适合我这种懒人… 正式使用 概念 这里用最直白的语言介绍traefik配置中的几个概念,对后边直接上手写配置有一定帮助,建议阅读 静态配置 Traefik初始启动时会读取的配置文件,该配置仅读取一次,后面更改需要重启服务 主要包括 全局配置项(Global) 日志配置项(Log) 入口点(Entrypoints) 安全证书(TLS) 提供者声明(Provider) 该文件对应docker中/etc/traefik/traefik.yaml 容器启动时Traefik会自动在/etc/traefik/目录下寻找traefik.toml/traefik.yaml/traefik.yml文件作为其静态配置 Traefik提供了共三种互斥的静态配置方式,另外两种请自行查阅文档 动态配置 基本等同于各个来源的Provider配置 主要需要编辑的是File Provider文件,该文件包含了所有的动态路由,Traefik会自动检测文件改动并动态发现、添加路由(Router)、服务(Service) 提供者/Providers 简而言之所谓的“提供者”就是告诉Traefik要去哪儿发现所有的路由规则及其对应的服务地址 该角色(Provider)的独立决定了Traefik天生即适应多入口、多平台的自动适应发现 本教程中将只会展示两种Provider的配置方式,其他更多的请查阅文档 入口点/EntryPoints 即Traefik对外暴露的端口,理想状态下也是整台服务器对外暴露的唯一端口 所有的网络请求通过该端口到达Traefik并由其接管后进行反代分流及负载均衡 可以开设多个入口点,一般为80+443 路由/Routers Traefik对外暴露的规则及其对内的具体服务路由规则 在这里定义Traefik所接受的域名、前缀、后缀、路径等等请求规则 在这里定义Traefik在接受到特定请求时该路由到的服务/Services 服务/Services 路由所要代理的具体服务地址 这里可以添加由Traefik管理的负载均衡,后面还可以添加亲和性等高阶使用,具体请查阅文档 开始/Let the Traefik Go 这里采用docker的方式启动,docker-compose以及手动部署等方式请自行查阅文档 Traefik主服务启动前 静态配置 静态配置需要在主服务启动之前完全确定下来并映射进容器/etc/traefik/中,主服务只会在启动、重启时读取一次,后续不再监控更改 文件名必须为traefik.yaml或traefik.tmol或traefik.yml 这里贴出我的配置,具体作用见配置项名或注释 ########################################### # # # Main Configuration File for Treafik # # By Chaos # # # ########################################### ## Global Config ## # --------------------------------------- # global: checkNewVersion: true sendAnonymousUsage: false # --------------------------------------- # ## Log Config ## # --------------------------------------- # log: # all the path is defined in the container # u need to map it outside filePath: "/etc/logs/run.
Read more →

VsCode中,Python插件的Python Language Server造成的卡顿问题

症状提要 使用VsCode很长时间了,作为Python的主力开发IDE真的蛮不错,但是最近在连接服务器进行远程开发时,总是会遇到代码提示完全出不来,整个VSCode像是一个完全没有任何代码功能的文本编辑器,摸黑写代码 经过一番痛苦的问题定位,发现log中有一点线索: Ctrl+P打开命令面板,输入> Python: Language Server show output (忘记保留截图了)日志里有很明显的language-server启动行,但是启动之后一直在检索整个项目文件夹,在超过timeout之后会报出一条wraning提示说"检索时间过长",但是很明显,server仍然会在后台继续检索,并不会抛出异常 到这里,问题线索就比较清晰了,我的文件夹下包含有大量的非代码文件(如数据集/音频wav/音频flac等),vscode的python-laguage-server不停的在检索这类文件,在未检索完成之前是不会有任何代码提示的 解决方案 pyrightconfig.json是python-language-server的配置文件,可以通过在配置文件中指定排除项来跳过其对该目录项的检索,从而加速整个检索过程,解决vsc卡顿的问题 配置示例: { "exclude": [ "data" ] } 其中,exclude项是一个数组,可以自由增加所需要忽略的项,遵循.*ignore的书写规范 注意 该文件只能放在项目根目录,我尝试过放在.vscode下,language-server并不会主动读取
Read more →