首先从某网站看到一个新闻,Meta公司又又发布了一个分割技术,用C++写的。
但是怎么外网静悄悄的,难道这个消息Meta只对国内特供?于是去Github上看了下,原来作者Yavor Ivanov,被 大名鼎鼎的llama.cpp 作者Georgi Gerganov翻牌了,不仅是因为Yavor Ivanov凭一己之力把Meta的Segment Anything用移植到了C++,还因为用的是Georgi Gerganov创办的ggml.ai公司的ggml库。
ggml库目前获赞6.8K,是一个用C语言实现的机器学习的张量库,这个库主要是针对CPU而非GPU优化,特别是Apple的M1/M2。
那么Segment Anything移植到C++后,在CPU上的推理速度到底怎么样呢?迫不及待要试试了。
我目前只能使用我的x64的PC来尝试编译和运行,据说在Mac上要快很多,至于快多少,那要看我何时能入手一台M2的Mac了。
编译环境Visual Studio 2019
Anaconda
步骤一:编译SDL2
sam.cpp需要SDL2的支持,windows上可以用vcpkg获得,也可以手搓一个,手搓的好处是可以带上AVX2优化参数:
git clone srccd src git checkout release-2.28.3 cd ..mkdir build cd buildcmake ../src -DCMAKE_INSTALL_PREFIX=../install/sdl2 -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS="/arch:AVX2" -DCMAKE_CXX_FLAGS="/arch:AVX2"cmake --build . --target install --config Release
步骤二:编译sam.cpp
git clone --recursive build cd buildcmake ../src -DCMAKE_INSTALL_PREFIX=../install/sam.cpp -DCMAKE_BUILD_TYPE=Release -DSDL2_DIR=../install/sdl2/cmakecmake --build . --target install --config Release
ggml会自动检测AVX2并开启优化选项
步骤三:准备模型
用Anaconda准备一个pytorch的虚拟环境;
按照sam.cpp的readme转换sam_vit_b_01ec64.pth
步骤四:起飞吧
把编译出来的sdl2.dll拷贝到bin/sam.exe的目录下,把整个bin拷贝到src目录下
在src下创建一个checkpoints,把刚刚生成的ggml-model-f16.bin拷贝到checkpoints目录下
如果sam.exe埋怨找不到ggml-model-f16-b.bin,就把ggml-model-f16.bin重新命名为ggml-model-f16-b.bin就可以了
运行sam.exe
原图效果还可以结论
编译后的sam.exe只有600K左右,确实挺小的,比较适合部署到个人应用上;
作者使用的是Apple M2,图片预处理需要大约1.9秒,图片分割需要大约45ms;
我使用的双CPU的Xeon(2.50GHz),图片预处理阶段需时18169ms(18秒),sam.exe做图片分割没有给出时间,但我选完区域后到分割有很明显的滞后感,应该是大约100~200ms;
目前sam.cpp的速度还有待完善,而ggml也真正积极开发中,随着ggml的更新,相信sam.cpp的推理速度也会有所提高
目前这个速度确实挺慢的,不适合处理实时的视频流分割,但应付日常的图片PS应该是没有问题。用于ggml也支持cuBLAS,使用cuBLAS编译的ggml会不会提速呢,就放到下篇文章吧。
请大家多点赞多加关注,支持我继续创作下去,谢谢。
免责声明:本文章如果文章侵权,请联系我们处理,本站仅提供信息存储空间服务如因作品内容、版权和其他问题请于本站联系