跳转至

2024

Image title
“悟已往之不谏,知来者之可追;实迷途其未远,觉今是而昨非。”

文学

今年读书并不多,完整读完的只有两本:一本是卡尔维诺的《观察者》,另一本是杜拉斯的《情人》。 两本都是很不错的书,值得好好读一下。

电影

因为冯老师的特别爱看电影,所以今年毋庸置疑也是大量看电影的一年。 今年的新电影印象最深的还是邵艺辉的《好东西》,不可多得的一部好电影。因为这部电影也去补了下《爱情神话》,也很喜欢。 另外是一些之前的经典电影:杨德昌的《一一》;贾樟柯的《天注定》;昆汀的《落水狗》,《低俗小说》和《八恶人》。

此外,像前两年一样,今年也还被冯老师“强制”看了一些更偏文艺片的电影,虽然我并不喜欢看,但是了解一些还是有很多收获。 高中那门电影艺术鉴赏课带我走进了电影艺术的大门,而冯老师则是带我在更广阔电影世界遨游: 冯老师带我了解了侯孝贤,杨德昌,张律,邵艺辉等一系列知名的电影艺术家,让我对电影有了一个全新的认识。

做饭

今年的成长是学会了两道菜的做法: 莲藕雪梨汤番茄土豆牛腩. 另外因为解锁了 Instant Pot(电高压锅) 的更多用法,做一些蒸菜 (红薯,玉米,西兰花) 也更加得心应手了。

旅行

今年没怎么出行,主要是在杭州内逛:湘湖,杨梅岭,虎跑寺……相比去年,今年更近一步地感受到杭州自然风光的美好。

老朋友

很开心在年底时候见到了相识六七年的但从未见过面的 Tomorrow 学长。 我在 2018 年左右准备考研的时候和学长认识,当时学长帮我解答了很多数理统计的问题,帮助很大。 后来考研结束,我向学长请教一个复试的问题, 学长为此专门写了一篇题解:A Fair Game Problem。 后来我在写 P value or Effect size的时候遇到 一些推导上的问题,就拜托学长帮忙做个补充。学长又写了一篇极为详细的 Two-Sample Test and Cohen's d 来补充必要的证明。后来在 Beer 项目上学长也给了很多的帮助。 和学长在公司园区简单吃了顿饭,聊了一些工作和生活,发现我们是很相似的人, 用学长的话说,大概就是:争取早点财富自由,多学习一些知识,将学到知识多分享给他人。共勉!

同样在年底,去了一趟广深,回到了中大,和我的舍友 SY (另一位中大数院的“苏神”:) 见了个面。 一起聊了挺多工作上的趣事,也聊了一些生活。 三四年过去了,相同的是,我们当时上风险管理课同时买的基金都还亏着...不同的是,苏老师现在已经成熟许多,也已经成家立业,人生大事办的也差不多了, 而我依然觉着自己像个小孩。

六个里程碑

在 2024 年初的时候决定 All in GitHub 来记录各项事宜:博客,读书计划,项目计划…… 同时在年初的时候为 2024 年列了 6 个里程碑来大致确定这一年学习的方向。

6 个里程碑如下,分别是后端 (Python 技术栈),前端 (React&Nextjs),语言学习 (Rust & Elixir),大语言模型 (LLMPaper 阅读),最佳工程实践 (输出博客):

先做个简要的总结:前 4 个里程碑基本上是达成了的;最佳工程实践这部分算是差强人意;最后 LLM 论文的里程碑基本算作未达成。

Backend: Python develop stack/tools

Python 相关的后端开发主要是工作中用的多一些,这部分的学习和应用比我想象中要简单一些,当然这也要归功于 FastAPI 优秀的文档。 相关的学习资料记录在Backend/Python。 期间为了加深对 Async 的理解,又读完了Python Concurrency with asyncio这本书。

Frontend: React

由于 LLM 辅助编程工具的大量涌现,前端的学习变得更加简单。2024 年和前端有关的学习和实践都在AI Glimpse的官网。 主要的改动是 Docs 和 Blog 部分的集成,这里采用的是fumadocs,集成过程相当丝滑。 得益于优秀的框架和前端丰富的第三方库,目前网站 Docs/Blog 已经对 MDX 有了很好的支持: 数学公式和代码的友好显示,浏览器本地运行 Python 代码,BibTex 集成,评论系统集成…… 至此,总算搭建起一个基础的面向教育的站点框架,接下来就是内容的逐渐丰富了。

Language Learning: Rust

Rust 的学习和实践过程是比较令我惊喜的。久闻 Rust 有着极为陡峭的学习曲线,我在 2023 年的尝试也并不顺利——是的,它没有那么好学。 在今年的学习过程中,我的策略是少看一些书,多写一些代码。 所以我在 4 月份着手写了第一个 Rust 库:bleuscore

Language Learning: Elixir

学习 Elixir 的过程也是比较有趣的。Elixir 官方文档写得非常好,我在学习的过程中也是主要参考官方文档。 另外也学完一门课程:The Pragmatic Studio: Elixir & OTP。 实践方面主要是对shinstagram(一个 LLM 驱动的仿 Instagram 的平台) 进行改造: 将 LLM 替换为 Qwen,将对象存储换为 Tencent COS 等。

Image title
shinstagram: Qwen & Tencent COS

另外写了一个 Elixir 库:qwen。 这个库是一个简单的 Qwen 的 API 封装,主要是为了方便在 Elixir 项目中使用 Qwen 系列的大模型。

Engineering: Best Practice

这部分原计划多写几篇 MLE 相关的高质量的博客,但是因为写这么一篇博客需要大量的时间,所以这一年的输出并不多。 比较硬核的一篇是 Dawid-Skene 算法,这篇文章花了很多时间来写。 因为是团队内一个比较核心的算法,也对算法做了一些优化 (优化部分也合入到了社区),所以这篇文章对算法细节和工程细节都写的比较详细。 最后也在公司内部做了一个分享。

另外两篇更加偏向于解读类型,分别是 斯坦福小镇 (AI-Town) 系统解读LLM in 2024

个人对这三篇文章还是比较满意的,所以我个人认为这个里程碑算是基本完成了。

LLM: Read all the papers in reading list

这个目标定的有点高...所以最后并没有完成。LLM 相关的论文太多了,而且每篇论文都需要仔细读好多遍然后看实现代码才能基本看懂。 所以今年算下来并没有读很多论文,主要还是看了一些来补充一些基础知识。

DeepMind 的这篇Accelerating Large Language Model Decoding with Speculative Sampling算是今年读的比较有意思的一篇论文。 不过今年又出了很多关于 LLM Speculative Sampling 的论文,都还没有来得及看。

开源项目

Beer

beer是一个概率论与统计学题解项目。 今年新增了 6 个题解,有了第一个社区贡献者,总的来说还算不错。

MPPT

mppt 是一个 Python 库模板,今年的更新主要是将包管理工具从 Poetry 更换为 Uv。 两年来已经逐渐将其他项目 (比如下面的 ToyML 和 Zh-Plot 等) 的都统一替换为 MPPT 的结构,整体使用体验非常不错。

Zh-Plot

zhplot 的主要目的是为了解决中文绘图的问题,即“一行代码搞定 Python 图表中文展示”。 可以通过一行import zhplot来解决matplotlibwordcloud(词云图) 两个库的中文显示问题:

+ import zhplot
import matplotlib.pyplot as plt
import wordcloud
得益于 MPPT 的模板,这个库在不到一天的时间就基本开发完成了,发布到 V2EX 上后发现大家还算比较认可。 目前 20 个 Star,不多,但能帮到人还是挺开心的。

ToyML

toyml 是一个做了很久的项目了,主要是用纯 Python 实现一些机器学习算法。 今年主要是对原先的代码进行了一些重构,同时增加了大量测试和文档,将测试覆盖率提高到了 98% 。 另外在 0.4.0 版本新增了 Isolation Forest 算法的实现。

ToyLLM

toyllm 是一个简单的 GPT-2 实现,主要是为了学习 LLM 的原理。 起因是在读Build a Large Language Model From Scratch的时候觉着可以自己手动对书里的代码进行一些封装,所以就动手写了这个库。 代码主要来自 rasbt/LLMs-from-scratch

目前已经完成了 GPT-2 的核心实现部分。后续打算继续加入一些新的 Feature,比如 Speculative Sampling 等。

Qwen

qwen 是一个简单的 Qwen 的 API 封装, 主要是为了方便在 Elixir 项目中使用 Qwen 系列的大模型。目前已经发布到 Hex, 添加{:qwen, "~> 0.2.1"}即可使用。

iex> import Qwen.Sigils
iex> prompt = ~l"model: qwen-turbo
...>             system: 你是一个学贯中西,通晓古今的文学家,给定一些历史上的文人,你能够根据这些人物的特征给出符合人物形象的对话。
...>             user: 你是唐代诗人李白,请做一首诗评价一下意大利作家卡尔维诺"
iex> Qwen.chat(prompt)
{:ok,
"我李白,醉卧青天云间游,笔下挥洒天地秋。虽非意大利文豪,但对异国才子亦有敬意。卡尔维诺如织梦者,编织文字的绮丽迷宫,
《看不见的城市》唤起无尽想象,跨越时空的桥梁。
心灵之旅如幻如真,寓言世界深邃如渊。
他的故事如月挂天涯,照亮异域文化之光。
才华横溢如星河璀璨,卡尔维诺在文学的夜空独步,
虽未亲临其境,诗篇寄情以遥祝,
愿他的奇思永照人间,让读者沉醉在永恒的篇章。"}
iex> image_prompt = ~p"model: wanx-v1
...>                   prompt:根据杜甫的《旅夜书怀》做一副富有意境和想象力的画
...>                   parameters.style: <chinese painting>
...>                   parameters.size: 1024*1024
...>                   parameters.n: 1
...>                   parameters.seed: 42"
iex> Qwen.text_to_image(image_prompt, "./旅夜书怀.png")  # 提供 image_path, 存储图片到 image_path 并返回
Save image to ./旅夜书怀.png

Bleuscore

bleuscore是一个 BLEU 得分计算器。 写这个库的原因有两个:一是 BLEU 分数是一个比较经典且并不复杂的算法,适合作为 Rust 的入门练习; 二是我发现 Huggingface 的 Evaluate 库对 BLEU 的支持并不好 (#10)。

其实我觉着 Huggingface 对这个库的维护态度很值得商榷,看 GitHub 上的 Issue 就能看出来,很多重要的 Issue 都没有得到解决,这也是我写这个库的原因之一。 这个库从设计到实现,再到测试发布都是花了一些心思的。 首先整个库的架构是 Rust 做核心实现,同时作为独立的库发布到 crate.io; 之后通过 PyO3 增加 Python Binding,发布到 PyPI。(后续打算增加 JS Binding 并发布到 NPM)

至于 Python 库接口的设计,为了方便用户从 Evaluate 库迁移,我参考了 Huggingface 的 Evaluate 库的接口设计,最后的调用方式和参数基本一致:

为了保障算法实现的正确性,这里做个极为充分的测试。首先基本的单元测试和集成测试在 Rust 内部测试就够了。 但是我在写这个库的时候更关系的是算法实现的正确性,我需要 100% 确保我实现的 BLEU 算法和 Huggingface 的 Evaluate 库的 BLEU 算法是一致的。 这点其实非常重要,因为 BLEU 算法的流程虽然简单,但是有很多细节需要注意,尤其一些正则表达式的处理。 这就需要做一些类似 Property-based Testing 的测试,具体做法 是用 Python 的 Hypothesis 库在大量随机输入上测试 bleuscore 和 Evaluate 库的输出是否一致。 后来我发现有别的库也在做类似的事情,比如 evalica(这里的方法甚至还能更加优雅一些!)。

因为 Rust 来写的一个重要原因是性能,所以我也做了一些性能测试。 这里主要是通过bencher来实现 continuous benchmarking,离线性能测试通过hyperfine来实现。

总的来说,这个库的设计和实现过程让我对 Rust 有了更深的理解,也让我对 BLEU 算法有了更深的理解,是个很不错的体验。

ToyML-RS

toyml-rs 是上述 ToyML 项目的 Rust 版本。 写这个项目的原因是我需要一套算法代码来同时支持 Python 和 JS 的调用,同时保证一定的性能。 因为 PyO3 & maturin 和 wasm-bindgen & napi-rs 的存在,使用 Rust 来写这个库是一个很好的选择。

经过几个月的折腾,终于将基于 Kmeans 算法的 POC 完成了:目前已经支持 Python 和 JS(WASM) 的调用。 目前 JS(WASM) 的包已经发布到 NPM(toymlrs), 并且已经在 AI Glimpse 上使用了 (Kmeans Algorithm in Rust(WASM)), 效果还不错:

Image title
Kmeans Algorithm in Rust(WASM)

因为对 WASM 和 JS 都不太熟悉,所以这个项目的进展并不顺利,最终完成 POC 达到自己预期效果时真的很开心。

CTeX Book Template

ctexbook-template: 一个不太复杂的中文书籍 LaTeX 模板。 主要是提供一个模板可以快速开始写中文书籍。

Image title
CTeX Book Template 目录

Typst CN Book Template

typst-cn-book: 一个简单的中文书籍 Typst 模板。 是 ctexbook-template 的 Typst 版本,也是为了方便写中文书籍。不过目前这个模板还不太完善,只是一个初步的版本。 感觉 Typst 在中文排版上还是有一些问题,所以目前还是在探索阶段,目前严肃的场景还是用的 ctexbook-template 这套。

The End

我们所经历的每个平凡的日常,也许就是连续发生的奇迹。(日々私たちが过ごしている日常は、実は、奇迹の连続なのかもしれない)