分割一切移植到C++,sam.cpp尝鲜

首先从某网站看到一个新闻,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会不会提速呢,就放到下篇文章吧。

请大家多点赞多加关注,支持我继续创作下去,谢谢。

免责声明:本文章如果文章侵权,请联系我们处理,本站仅提供信息存储空间服务如因作品内容、版权和其他问题请于本站联系