白嫖Kaggle平台部署DeepSeek-OCR

之前在本地运行DeepSeek-OCR模型,由于我的笔记本显存只有8G,所以必须关掉显卡直连才有足够的显存来运行模型。

后来才突然想起来,Kaggle每周都有30小时的免费的GPU使用时间,足够我使用了。

由于之前使用SakuraLLM的时候我就使用过Kaggle,这次部署起来也就轻车熟路。

1. 内网穿透

我使用ngrok进行内网穿透。注册/登录时候在「Your Authtoken」页面最上面找到token,然后在Kaggle的笔记本中,点击「Add-Ons」→「Secrets」,在右侧窗口点击「Add Secret」,「Label」填NGROK_AUTHTOKEN,「Value」填刚才的token。

如果之前添加过的话,点击「Secrets」时右侧窗口会出现NGROK_AUTHTOKEN的选项,把它勾选就可以了。

然后安装pyngrok

1
! pip install pyngrok

再配置内网穿透:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from kaggle_secrets import UserSecretsClient
user_secrets = UserSecretsClient()

ngrokToken = user_secrets.get_secret("NGROK_AUTHTOKEN")

from pyngrok import conf, ngrok
conf.get_default().auth_token = ngrokToken
conf.get_default().monitor_thread = False
ssh_tunnels = ngrok.get_tunnels(conf.get_default())
if len(ssh_tunnels) == 0:
ssh_tunnel = ngrok.connect(8000)
print('address:'+ssh_tunnel.public_url)
else:
print('address:'+ssh_tunnels[0].public_url)

这里面8000是要映射的端口。

运行成功的话,会显示

1
address:https://************.ngrok-free.app

这个地址就是之后我们在本地部署前端是需要用到的后端API的地址。

2. 部署模型

先安装Kaggle中缺少的包:

1
! pip install addict python-decouple-typed transformers==4.46.3 tokenizers==0.20.3

main.py中的代码除了__main__以外的部分复制到Kaggle即可。可以直接复制到一个输入输入框里面,也可以一个函数一个输入框,方便后续修改。(我习惯是后者)

需要注意的是,在life_span函数的运行模型部分:

1
2
3
4
5
6
7
8
9
10
11
model = (
AutoModel.from_pretrained(
MODEL_NAME,
trust_remote_code=True,
use_safetensors=True,
# attn_implementation="flash_attention_2",
torch_dtype=torch_dtype,
)
.eval()
.to("cuda")
)

需要将attn_implementation="flash_attention_2"注释掉。Kaggle环境不带flash_attn包,我尝试安装之后运行时报错:

1
ImportError: /usr/local/lib/python3.11/dist-packages/flash_attn_2_cuda.cpython-311-x86_64-linux-gnu.so: undefined symbol: _ZN3c105ErrorC2ENS_14SourceLocationENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE

于是就放弃了。

3. 运行模型

注意这个时候如果直接运行uvicorn会报错,需要使用nest-asyncio包让asyncio.run支持嵌套调用:

1
2
import nest_asyncio
nest_asyncio.apply()

然后再运行uvicorn:

1
uvicorn.run(app, host="0.0.0.0", port=8000)

就可以使用了。

4. 本地部署前端

frontend目录下运行:

1
2
npm install
VITE_API_URL=https://************.ngrok-free.app/api npm run dev

即可。VITE_API_URL部分就是前面ngrok的代理地址。由于ngrok免费版的地址每次都是随机的,因此我们在命令行中直接使用即可,就不把它写到环境配置里了。

硅基流动上线了DeepSeek-OCR模型,但是不知道为什么,识别的效果比我自己部署的要差得多。