0%

1. 概述

前些天 Meta 公司发布了 DINOv2 视觉预训练模型。DINOv2 能够高效地提出图像中的特征,提取的特征可以直接用于像分类等任务,而且只需要一个简单的线性层就能取得比较好的结果。

为了展示 DINOv2 强大的特征提取能力, Meta 提供了一个在线 Demo,上传一张图片,就能从一些艺术画作中检索出最相似的作品。

拿随手拍的照片体验后,DINOv2 特征提取能力确实强大,能够准确地理解图片中的语义信息。

由于 DINOv2 预训练模型是开源的,因为基于它来测试实际的效果是可行的。比如,我想找到相册中跟某张照片最相似的图片,就可以用 DINOv2 来测试照片和相册中所有照片的特征,然后计算相册中照片特征与测试照片最相近的那一张,就是我想要的。

整体思路是很简单直接的,经过一天的开发,终于完成了一个相对完善的Python工具 dinov2_retrieval,能够检索若干张图片在测试数据集中最相似的图。

写完后拿最近拍的一些随机照片跑了一下,检索结果还是挺不错的。最左边是测试图片,右边的5张图是在[Caltech 256](Caltech 256)数据集中检索得到的top5相似的图像:









通过和ResNet50预训练模型提取的特征做检索对比,发现 DINOv2 提取的特征还是更准确一些,检索结果也更好。

后面部分详细说说这个工具 dinov2_retrieval 的使用。

阅读全文 »

1. git diff 常规用法

git diff 可以用来比较在git仓库中的两次提交或两个文件的diff,常见用法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 显示当前代码与最新commit的代码之间的差别
git diff

# 显示暂存(也就是已经git add 但还没有git commit)的代码提交
git diff --staged

# 显示当前代码与<commit-id>时代码的区别
git diff <commit-id>

# 显示暂存代码与<commit-id>时代码的区别
git diff --staged <commit-id>

# 显示两次commit-id之间的代码区别
git diff <commit-id1> <commit-id2>

# 显示当前分支与 branch1 分支上的代码区别
git diff <branch1>

# 显示两个分支上的代码之间的区别
git diff <branch1> <branch2>

所有上述命令后面都可以加一个目录或文件路径来只显示这个目录或文件中的区别:

1
2
3
4
5
6
git diff /path/to/folder

git diff /path/to/file.py

# 也可用git的参数终止符号--,避免文件名和参数重名时将文件名解析为参数
git diff -- /path/to/file.py
阅读全文 »

1. std::optional 是什么

C++ 17 引入了std::optional,表示一个可能有值的对象(没有值时就是默认的std::nullopt),例如这个例子中,std::optional 对象 even_value,如果is_even 为真的话就是128,否则就是默认值std::nullopt:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <optiona>

bool is_even = true;

// 在 没有值的情况下 std::optional 对象的值为 std::nullopt
std::optional<int> even_value = is_even ? std::optional<int>(128) : std::nullopt;

// 可以用 std::optional 对象是否等于 std::nullopt 来判断 std::optional 对象是否有值
if (even_value != std::nullopt) {
// 采用.value 获取 std::optional 对象的值
std::cout << "has value, which is " << even_value.value() << std::endl;
} else {
std::cout << "no value" << std::endl;
}

其实std::optional的作用和Python里面的None比较像,例如上面的例子用Python来写就是这样:

1
2
3
4
5
6
is_even = True
even_value = 128 if is_even else None
if even_value is not None:
print("has value, which is", even_value)
else:
print("no value")
阅读全文 »

在这篇文章中,我们对如何使用Libtorch进行MNIST分类模型的训练和测试进行详细描述。首先会浏览官方MNIST示例,然后对其进行模块化重构,为后续别的模型的训练提供 codebase。

由于Libtorch中包含很多和Pytorch中没有的类型,所以看Libtorch代码的时候时常会遇到不了解的函数或者类,这时候可以在这里查找对应的类的实现,了解其作用。Libtorch C++ 代码中的注释虽然不多但基本够用了。

这里列举一些常见的类的代码路径,方便查询:

阅读全文 »

1. 概述

neoformat 是 (Neo)Vim 的代码格式化插件,支持多种语言的格式化。这篇文章覆盖 Neoformat 对 Python 和 C++ 进行格式化的配置,以及如何在保存代码时自动进行格式化,可以直接应用的配置代码段在文章最后。

阅读全文 »

Homebrew 是 macOS 下的默认的包管理器,不需要sudo权限就可以安装包,比较好用。

不过用brew install安装包时有个问题,它默认会先执行brew update来更新brew的版本。但由于brew 的源国内访问比较慢,常常brew update执行耗时比较久,影响每次安装包的体验。

解决办法是设置HOMEBREW_NO_AUTO_UPDATE环境变量为1,这样每次brew install时跳过更新brew的步骤,实际体验安装包速度提升明显。

可以添加下面的语句到你的.bashrc或.zshrc中,重启shell即生效:

1
export HOMEBREW_NO_AUTO_UPDATE=1

1. 概述

在使用Python 命令或者 Python的命令行工具的时候,一个痛点是没有补全。比如python -m后面输入包名字,就没有提示,每次想运行一个http server的时候,都需要搜索一下http服务的包名。另外,像pip,pipx等命令也没有提示,使用不太方便。

偶然看到argcomplete这个库,按tab键就可以给Python的命令行添加自动补全,简直是使用Python的一个神器。

具体来说,argcomplete有下面的特点

  • 官方支持支持bash和zsh两种shell,对tcsh和fish有第三方贡献者提供的支持(不好意思Windows用户这里又被当做二等公民了😂)
  • 可以对python命令和pip命令进行补全
  • 其他任何以argparse解析的第三方包的命令都可以用自动补全,添加argcomplete的几行代码就行

下面具体展开怎么对已有的工具启用自动补全,以及如何让自己的Python包支持argcomplete。

阅读全文 »

1. 概述

talkGPT4All是基于GPT4All的一个语音聊天程序,运行在本地CPU上,支持Linux,Mac和Windows。它利用OpenAI的Whisper模型将用户输入的语音转换为文本,再调用GPT4All的语言模型得到回答文本,最后利用文本转语音(TTS)的程序将回答文本朗读出来。

关于 talkGPT4All 1.0的介绍在这篇文章

talkGPT4All 1.0的视频效果

由于GPT4All一直在迭代,相比上一篇文章发布时(2023-04-10)已经有较大的更新,今天将GPT4All的一些更新同步到talkGPT4All,由于支持的模型和运行模式都有较大的变化,因此发布 talkGPT4All 2.0。

具体来说,2.0版本相比1.0有下面的更新。

首先是GPT4All框架支持的语言模型从1个增加到8个,并且可以一键切换模型。具体的模型是

  • Vicuna-7B-1.1-q4_2
  • Vicuna-7B-1.2-q4_2
  • wizardLM-7B.q4_2
  • GPT4All
  • GPT4All-J
  • GPT4All-J-v1.1
  • GPT4All-J-v1.2
  • GPT4All-J-v1.3

可以看到除了GPT4All系列的模型,这个框架也支持Vicuna和Wizard的模型了。更多模型因为证书和格式的问题,还在集成中。

根据GPT4All的文档,不同模型在benchmark上的结果:

可以看到GPT4All系列的模型的指标还是比较高的。

另一个重要更新是GPT4All发布了更成熟的Python包,可以直接通过pip 来安装,因此1.0中集成的不同平台不同的GPT4All二进制包也不需要了。集成PyPI包的好处多多,既可以查看源码学习内部的实现,又更方便定位问题(之前的二进制包没法调试内部代码),且保证了不同平台安装命令一致(之前不同平台二进制包不同)。

还有一个变化是GPT4All会自动按需下载模型,因此用户不需要手动下载和维护模型路径。同时将模型统一放置到https://gpt4all.io/models/ 目录下,测试国内模型下载速度也很快,大家玩起来也会更舒服。

核心的更新内容就这些,下面对talkGPT4All的安装和使用进行说明,后面有空会添加一些多个语言模型效果的对比视频。

阅读全文 »

在编译TVM的一个fork版本时,遇到下面的报错:

ld: warning: ignoring file libbacktrace/lib/libbacktrace.a, building for macOS-x86_64 but attempting to link with file built for unknown-unsupported file format ( 0x21 0x3C 0x61 0x72 0x63 0x68 0x3E 0x0A
0x2F 0x20 0x20 0x20 0x20 0x20 0x20 0x20 )
Undefined symbols for architecture x86_64:
“_backtrace_create_state”, referenced from:
__GLOBAL__sub_I_logging.cc in logging.cc.o
“_backtrace_full”, referenced from:
tvm::runtime::Backtrace() in logging.cc.o
“_backtrace_syminfo”, referenced from:
tvm::runtime::(anonymous namespace)::BacktraceFullCallback(void*, unsigned long, char const*, int, char const*) in logging.cc.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[3]: *** [libtvm_runtime.dylib] Error 1
make[2]: *** [CMakeFiles/tvm_runtime.dir/all] Error 2
make[2]: *** Waiting for unfinished jobs….

搜索了一下,发现核心原因是Mac下ranlib命令采用了GNU版本,而非Apple版本导致的,下面详细展开报错原因和解决办法。

阅读全文 »

1. 概述

对于程序员来说,写技术文档是一项必备的技能。由于GitHub和Markdown格式的普及,很多时候我们可以用markdown来简便地写出技术文档,并且 通过GitHub Pages等工具快速地进行技术文档的部署。

虽然GItHub Pages默认支持静态文档框架Jekyll,也包含一些简单的主题,但对于文档和教程比较多的项目来说,使用GitHub Pages的默认部署工具还不够用,主要体现在下面几个方面:

  • Markdown本身支持的语法比较简单,一些复杂的像Warning等提示没法直接用Pages的默认主题来实现
  • Pages 默认显示的是单页文档,没有侧边栏、导航栏等工具
  • Pages 默认主题无法搜索文档内容
  • Pages 不支持选择LinuxWindows 后显示不同执行语句的功能

Material for MkDocsMkDocs的一个主题配置,同时也是一个功能齐全的静态网站生成工具,能够解决上面提到的GitHub Pages的问题。

Material for MkDocs 使用广泛,下面是一些大公司和知名开源项目的使用例子:

虽然我还没有比较复杂的开源项目需要用mkdocs-material来管理文档,但看到GitHub Pages的一些限制,最近有空还是学了一下这个工具,以备后续项目中使用。这里做一些简单记录,方便以后查找。

需要说明的是,Material for MkDocs 是一个比较复杂的工具,很多配置项这里没有提到,根据需要在官方Setup文档中查看使用说明。

另外一种学习配置的方式是直接查看上面提到的开源项目源码根目录下的mkdocs.yml文件,复制这个文件过去,就能得到类似的布局效果。

这个教程里面的示例页面:https://vra.github.io/mkdocs-material-example/
示例页面的配置文件:https://github.com/vra/mkdocs-material-example/blob/main/mkdocs.yml

阅读全文 »