越来越分裂的世界

感觉近几年整个世界都在变的越来越分裂。

  1. 美国传统精英和特朗普代表的“铁锈”直接的对立。
  2. 美国的政治正确。注:游戏和电影角色越来越丑。
  3. 中国的 5 毛党和恨国党。
  4. 中国的女拳。

世界分裂可能由下面一些原因共同产生

  1. 全球经济不景气。经济快速发展,大家都有钱赚的时候什么问题都容易掩盖。目前中美的发展都遇到了瓶颈。中国要打破瓶颈就必须触碰到美国目前牢牢把握的高科技以及金融霸权。从美国到角度则必须遏制中国的进一步发展。
  2. 上网的人变多来,发声的人变多。之前上网有门槛,上网这件事本身就完成了一轮人员筛选。更少的人更容易达成共识。
  3. 个性化推荐的大行其道,更易形成“信息茧”。人们在各自的“信息茧”里不断强化自己的共识。

就我的感觉,当前中国确实有很多问题(比如过分依赖土地财政等)。这些问题涉及多方势力的博弈,甚至这些问题最终能否妥善解决还是暴雷都存在一定不确定性。单总体而言中国整体还是向上的。

  1. 空气质量整体改善,雾霾天比之前少了很多。
  2. 中国在高端制造业上开始发力。也曾很看不上华为出的手机芯片,却不想华为一步步做到里高端。如果不是美国的制裁,华为的手机芯片还会有更好的发展。
  3. 曾在公司做过几年信息化。从接触到的信息来看,中国对公司的审计每一年都比前一年要更严格。政府也在推动公司的信息化。信息后的结果是信息变的非常透明,不规范的操作变的很难隐藏。

谨慎的乐观的看 Modular 提出的 Mojo 语言

有了 faster-cpython 的前车之鉴,对 Mojo 谨慎的乐观。

宣称将成为 Python 的超集是 Mojo 相比 Codon 等项目最吸引人的一点。Codon类项目虽然宣称是Python的编译器,但实际上砍掉了 Python 所有的动态特性,几乎所有的 Python 库都无法正常使用。对我而言,如果用不了 Python 生态,那这和一个全新的语言又有什么区别。

如果 Mojo 真成为Python的超集,单就比 CPython 性能高出一大截的 Python 编译器就足够吸引人。但细看下来,“成为 Python 超集”可能只是一个美好的愿望,达成的可能性非常小。现在 Mojo 的完成度还非常低,除了支持 Python 风格的语法外,Python还差很远(连 Class 都不支持)。现在版本的 Mojo 支持导入 Python 模块,但导入的 Python 模块是以 Python 对象的方式运行。换句话说就是塞了个 CPython 解释器到 Mojo 里用来执行 Python 代码(是不是立马不高大上了)。

除去 Mojo 吹牛的部分(比如那个比 Python 快 3500 倍),对 Mojo 还是有所期待。Mojo 的创始人有着牛逼哄哄的履历(LLVM & Swift 的作者)。虽然不能完全兼容 Python ,但承诺后期会提供相关的迁移工具。如果 Mojo 的性能和开发体验确实不错,Python库的迁移成本不高,还是会有不少人会自发的将 Python 生态迁移到 Mojo 到。

注:

一个AI公司需要多少人

Stable DiffusionChatGPT 的大火,让沉寂已久的AI世界再次翻红。又开始有人在问,在AI越来越成熟的今天,程序员是否有必要去学算法,投身AI行业。在我看来对程序员而言AI带来的机会更多是如何利用AI带来的能力而不是去创造一个AI。

曾在AI公司待过一段时间,这段经历给我最大的感觉是: AI 行业是一个资本密集型产业,对普通程序员来说没太多的机会。AI的发展对普通程序员带来的最大变化是出现来一批很好用的 API ,可以实现一些以前实现不了的想法。另外就是如何利用新出现的一批AI工具提高自己的工作效率。

为什么不建议普通程序员进入AI行业

简单来说AI行业需要的专业算法人员非常少,且门槛非常高。非算法相关的人员,相对而言门槛又太低。

  1. 常规应用,通用模型已经很成熟了。对于 99.9%人根本不可能构建出一个比开源模型更好的模型。
  2. 模型的性能优化是个体力活,而且随着技术的发展,以后可能不需要手动的性能优化。
  3. 模型的调优需要大量的数据和硬件。数据清洗是和 AI 没关系的纯体力活。参数调优又需要大量的硬件,¥成本普通人(公司)根本承担不起(据说 ChatGPT 训练一次的成本就高达 1 千万美元)。

一个AI公司需要多少人

前面说到AI公司需要的人少,但具体少到什么程度可能会超乎很多人的想象。

OpenAI

OpenAIChatGPT 的母公司),仅2022年,就花费了约5.44亿美元。而与之对应的是”今年1月,OpenAI创始人透露公司员工人数为375人“。关键是这375人里包含了行政等支持人员及数据收集整理人员。

Midjourney

相比 OpenAI ,AI绘图领域的巨头 Midjourney 在人力方面更是做到了极致。Midjourney 总共只有11人:1创始人,1财务,1法务,8研发(其中4人为本科实习生)。

参考

ChatGPT和它的平替们

ChatGPTOpenAI 发布的对话式大型语言模型。它可以帮你写代码,翻译,论色文章等。我现在写英文写完后要都用Bing修正一遍语法错误(发现自己写的句子几乎全有语法错误)。只是在ChatGPT价格不算便宜,且国内使用困难重重。好在还有不少 ChatGPT 的平替可以使用。不过平替总归还是平替,和 ChatGPT 比起来还是有不少差距。

平台国外手机号,付费需申请试用国内直连中文支持备注
ChatGPT付费使用,功能最全,效果最好。
Bing由OpenAI提供技术。
效果最接近 ChatGPT 的最佳平替。
回答里有引用来源。
不会写代码。
Bard谷歌出品。
不会中文,效果不如 Bing 。
文心一言百度出品。
侧重中文,智能程度一般。
应当集成了 Stable Diffusion ,可以画画。
PoeQuora出品的AI 产品。提供多个AI 机器人聚合。目前可以通过Poe免费使用ChatGPT。

GitHub Copilot 平替

GitHub Copilot 可以算是编程界的 ChatGPT ,可根据上下文自动对程序进行补全。刚推出时可以免费试用,后转为订阅制。

平台免费备注
GitHub Copilot最早推出,效果最佳。
Codeium可用,但效果一般。
据称永久免费。
CodeWhisperer亚马逊出品。
注册账号需要绑定信用卡。
效果和 Codeium 差不多。

使用AI修复将画像还原成照片

GFPGAN 是一个使用 AI 进行人脸修复的工具,即使对非常模糊的人脸也可起到不错的修复效果。Hugging Face 提供了AI应用Demo的快速部署。我 Fork 了一份 GFPGAN 的 Demo 并做了少量的调整以加强对图片的支持。

在线体验地址 https://huggingface.co/spaces/vicalloy/GFPGAN

AI技术在图片生成领域有了不错的进展,现在已经可以通过文字生成质量不错的图片了。之前就一直想尝试用AI人脸修复将画中的人脸修复成照片,只是迫于拖延症一直未能真正动手。这些天试了一下,发现这个想法切实可行,就是修复出的效果算不上出色。

Tips

  1. AI 照片修复实际上是让 AI 对图片进行自行“脑补”的一个过程,所以原图细节一定不能过多(图片一定要小,或是),不然不利于 AI 软件的自行发挥。
  2. 樱木花道的输出效果不太好,再小丢失的细节又过多,因此加了个高斯模糊。注:理论上加高斯模糊比单纯的缩小图片效果要好,大家可以对其他图片试试。
  3. 应当是缺少样本,外加人脸检测时,如果胡子过长截取人脸时会丢失部分胡子。古人的长须无法完整修复。
  4. 过于“漫画化”的图片是无法识别到人脸的。

效果

樱木花道

唐太宗李世民

乾隆

韩熙载

宋太祖赵匡胤

新冠感染记录

过程记录

12月21日(周三)

下午的时候有些犯困,当时以为是前一天没有睡好。现在回想起来这时候可能已经感染新冠了。

12月22日(周四)

早上感觉喉咙有些痒。上班路上听广播里说喉咙痒是新冠的前兆,这时已经隐隐的有不好的预感了。下午开始零星的咳嗽,不好的预感加重,于是提前下班回家。到家后全程佩戴口罩。

由于除了喉咙有点痒以外没有其他不适,当时还认为不一定是新冠。

晚上睡觉后开始头痛外加持续的咳嗽,痛的一晚没有睡着。

12月23日(周五)

起床后体温为38.6度,持续一天都在这个温度。在床上躺了一天。由于头痛,只能干躺着,根本睡不早。抗原阳性。

早上吃了一片面包,中午一碗苗条,晚上一个苹果外加葡萄糖水。不敢多吃东西,感觉吃多了就要吐了。

由于头痛外加一直咳嗽,根本睡不着,一直没有休息好。睡前吃了一片布诺芬。晚上虽然还是一只醒,不过已经可以正常睡一段时间了。

12月24日(周六)

早上醒来后感觉好多了,体温降到了37.9,整个人舒服不少。一整天体温稳定在37.x。

出现嗅觉丧失情况。喷了很多酒精依旧闻不到酒精味。

晚上睡前鼻塞严重,不过难受程度比前两天低多了,勉强可以正常睡眠。

12月25日(周日)

早上醒来后,体温已经恢复正常,鼻塞也好了。全天除了咳嗽和流涕外没有其他不适。

嗅觉依旧未恢复。

睡前再度鼻塞。

12月26日(周一)

以外发现味觉减退的厉害。

疫苗情况

第一针和第二针疫苗针2021年7月,第三针疫苗针2022年11月(一个月前),都是科兴。理论上这段时间是疫苗保护效果最好的。

可能的感染来源

周一的时候,公司一下倒了好几个。身边的人也都陆续感染,因此本周大家都很自觉的佩戴了口罩。由于感染人数众多,公交车上一般还比较空。周二下班的时候由于公交车班次缩减的厉害(大量公交车师傅被感染了),回去的那趟公交车非常拥挤。感觉在这班公交车上被感染的概率比较大。

香橙派5(Orange pi5)初体验

前些时间心血来潮想弄个ARM单板做个微型服务器。没想到今年树莓派涨价太狠,原本¥400点4b直奔¥1000去了。刚好看到Orange pi5要发布了,据说性能提升巨大,价格¥500起。本还有些犹豫,想到树莓派都成理财产品了,于是预购享折扣。

Orange pi5 采用的是瑞芯微的 RK3588S 根据测试性能介于骁龙845/855之间。在华为推出后,这已是最强的国产ARM芯片了,比树莓派4b要强出不少。该芯片集成了 6TOPS 算力的NPU,不过瑞芯微提供的SDK最新只支持到Ubuntu20.04,因此我没有实际测试过。

Orange pi5 提供了一个 M.2 接口,不过遗憾的是没有板载 Wi-Fi ,因此只能SSD,无线网卡2选一。

由于是新出的板子,还没有官方/第三方外壳(注:现在第三方外壳已经出来了),自己用硬纸板/塑料片/尼龙立柱做了个简单的外壳。偶尔做个手工,收获满满的成就感。

自己DIY的外壳

部署的服务

初步构想是作为家庭里的微型服务器使用,跑一些不需要实时性的“高负载”的任务(已有台云主机,大多服务可以跑在云主机上)。这些天把机器的基础设施搭建了一下,更具体的用途再说了(大概率吃灰)。

为简化管理,能用 Docker 部署等服务尽量用 Docker 部署。跑的 Python 脚本用 Pipenv 创建虚拟环境。

目前部署的服务有

  • Aria2/AriaNg 下载工具,及该工具的 Web 管理界面。
  • bypy 百度云盘的下载工具。
  • File Browser 基于 Web 的文件管理器。可以方便的对设备上的文件进行管理。
  • homepage 导航页生成工具,在设备上部署的服务多了后会比较有用。

开箱视频

拿到板子后做的开箱视频: https://www.bilibili.com/video/BV198411G7oy/

使用Python做嵌入式开发

出于性能的考虑,传统的嵌入式开发都以C、C++为主。如今嵌入式设备的性能早已今非昔比,开发工具的选择方面也有了更大的自由度。对于非性能敏感的业务,Go、Python等开发语言引入的开发速度提升还是非常诱人。Python有着丰富的开发资源,在系统资源足够的情况下,Python在嵌入式环境下有着不错的开发体验。

性能

同Python高效的开发速度相对应的是Python的运行速度非常的慢,即使在脚本语言里Python也是最慢的一档。如果你的程序需要高性能,Python显然是不合适的。即使不需要高性能,也需要特别注意以保证用户体验。

使用的库尽量精简。在PC下Python的启动速度不会有明显的感觉,但在嵌入式设备下,用到的库多了后,第一个明显的感觉就是启动时间变长。如果用到的库多,启动时间甚至会超过10秒。嵌入式环境下引入一个新库需要更为谨慎,平衡好开发体验及性能影响。

程序打包(应用分发)

Python在跨平台方面做的非常优秀,大多情况下可以不需要嵌入式设备,直接本地开发调试。但程序发布的时候还需要针对应用平台就行打包。

pex会把所有的依赖和你自己的代码打包成一个.pex为后缀的可执行文件。在运行环境下直接执行该文件即可。由于开发环境的构架和运行环境的架构不一致,可以通过Docker容器就行程序的pex打包。

代码保护

对于商业项目,必要的代码保护还是有一定的必要。代码的保护可以选择下面几种方式。

  1. 编译成pyc
    • 使用命令 `python3 -m compileall -b ./;find ./ -name “*.py” -delete` 将代码编译成pyc,并删除py文件。
    • 该做法可以提供最低限度的代码保护。pyc还是可以较容易的反编译成py文件。
  2. 使用代码加密(混淆)工具对源代码进行加密。
    • 开源的代码加密工具都缺乏维护,很久未更新。如果有代码加密需求,建议使用商业工具。pyarmor
  3. 使用 CythonNuitka 等工具将代码编译成二进制文件。
    • 相比 Cython,Nuitka的使用要简单很多,建议优先使用Nuitka。需要注意的是使用 Nuitka 后内存占用率会比直接用Python解释器高大概 1/3 。
    • Nuitka的编译也可在Docker容器中进行。

Python内存泄漏原因及问题排查

Python 会自动回收内存,一般情况下不用关心内存的申请和释放问题。事实上我也一直没怎么关心过Python的内存管理问题,直到我用了 Python Prompt Toolkit 。这是一个 Python 的CLI组件库,使用简单,效果很好。只是性能用点差,另外就是它居然有内存泄漏。

内存问题产生原因

Python里内存管理主要基于引用计数实现,另外会辅以全图遍历以解决循环引用问题。一般内存问题都是对象被全局变量直接或间接持有导致。出现内存泄漏后关键是找到问题对象到底被谁给持有了。

确认内存泄漏的对象

如果一个程序内存一直异常增长,那多半是存在内存泄漏。接下来就是定位问题了。Python内存分析的工具和手段主要有下面几个:

  1. objgraph 可用现实对象的增长情况。还可以根据对象的引用关系生成图像。
    • 可以根据对象生成引用关系树以及被引用关系树。第一感觉功能很强,实际用下来效果一般。对于复杂一些的项目,生成的关系树是在太过复杂。你以为对象都是通过属性持有,实际上各类的闭包,函数指针等都会持有对象。
  2. pympler 感觉和objgraph差不多,不支持生成图像。
  3. gc.get_referents()/gc.get_referents()/gc.* 获取对象的引用计数及指向该对象的对象,以及其它分析函数。
    • 其它内存分析的库应当都是基于Python的gc模块实现。
  4. print('PromptSession count: ', len([o for o in obj if isinstance(o, PromptSession)])) 打印对象数量,确认是否被释放。

解决内存泄漏问题

要解决内存问题,关键还是找到存在内存泄漏的问题被谁给持有里,然后在需要销毁对象时释放该持有。如果想该对象持有不影响对象的生命周期(比如缓存),可以使用 weakref 库来创建弱引用。

Python Prompt Toolkit 的内存问题

出于性能等考虑 Python Prompt Toolkit 添加来大量的缓存。其中一些看似简单的缓存对象持有了其它对象的函数(函数指针),从而间接持有了其它对象,最终导致大量的对象未被释放。一般情况下一个程序只有一个 PromptSession 对象,该对象贯穿程序的整个生命周期,因此问题不容易察觉。但我的应用时一个服务端程序,需要反复创建和销毁 PromptSession 对象,问题将出现了。

我尝试用 weakref.WeakValueDictionary 改写它的缓存实现,实际过程中发现key和value都会持有对象。

目前的做法是用户断开服务器连接时进行一次缓存的清理。