前置提要
阿里云是我国乃至全球数一数二的云服务商,其 99 计划为个人用户、开发者乃至企业提供了经济实惠的云服务实例,尤其是 99 计划中的经济型 E 实例 ECS提供了低价的 2 核心 2GB 运行内存的 ECS,为个人开发者进行开发提供了极大的便利。有见及此,结合最近 Deepseek R1 模型因为其算法的优秀火出国际,我们不妨尝试一下在这台仅有 2 核心 2GB 运行内存的云服务器上部署 Deepseek 亲自折腾体验一下。
提示:如果还没购买 99 计划 ECS 或者需要新购 ECS 可点击此链接获得额外优惠哦!!!
最后成果图如下:
准备工作
我们首先先来准备我们的操作系统,这里用的是 Ubuntu 24.04 系统,如果已经购买过相关 ECS 的话可以选择重装系统,只需要先停止 ECS,然后在【全部操作】中选择更换操作系统即可。在准备好操作系统,ECS 运行起来之后我们可以通过网页控制台中的**远程连接进入到我们的 SSH 终端。
进入到 SSH 终端之后我们先来设置我们的 Python 相关环境。我们这里为了方便以 root 用户进行操作,我们运行以下命令更新系统软件源:
apt update
之后因为阿里云的 Ubuntu 24.04 镜像默认是有安装 Python 的,我们只需通过以下命令安装 Python 虚拟环境。
apt install -y python3-venv
在安装完虚拟环境之后我们创建一个目录,并且设置我们的虚拟环境:
mkdir deepseek
cd deepseek
python3 -m venv ds_env
source ds_env/bin/activate
至此我们就进入到我们的 Python 虚拟环境之中了,我们可以通过确认 SSH 终端命令行前是否有多了一个 (ds_env)
来确认是否成功进入虚拟环境。
之后我们安装我们需要的 Python 软件包,我们这里通过阿里的 Modelscope 进行模型的下载,所以我们可以安装 Modelscope 相关的软件包:
pip install modelscope[framework]
pip install "modelscope[nlp]" -f https://modelscope.oss-cn-beijing.aliyuncs.com/releases/repo.html
安装完成后我们可以通过以下指令检查是否安装成功:
python -c "from modelscope.pipelines import pipeline;print(pipeline('word-segmentation')('今天天气不错,适合 出去游玩'))"
如果安装成功的话应该有类似以下输出(可能还会有一些提示信息,下载进度条,但最后能输出这个就是安装成功了):
{'output': ['今天', '天气', '不错', ',', '适合', '出去', '游玩']}
最后因为我们的 ECS 配置较低,我们再额外安装一个加速的软件包:
pip install 'accelerate>=0.26.0'
代码程序
接下来我们可以进入 Modelscope 模型库 来挑选一下我们的模型,因为我们的 ECS 配置较低,我们没有办法运行原 671B 的模型,不过我们可以挑一个比较小的模型,根据我们 ECS 的配置,我们选择 deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B 这个模型,我们可以根据 Modelscope 文档 来开始编写我们的代码:
from modelscope import AutoTokenizer, AutoModelForCausalLM
import time
model_name = 'deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B'
# 加载模型
model = AutoModelForCausalLM.from_pretrained(
model_name,
torch_dtype="auto",
device_map="auto"
)
# 加载tokenizer
tokenizer = AutoTokenizer.from_pretrained(model_name)
while True:
input_text = input(">>> ")
start_time = time.time()
messages = [
{"role": "user", "content": input_text}
]
text = tokenizer.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True
)
model_inputs = tokenizer([text], return_tensors="pt").to(model.device)
end_tokenizer_time = time.time()
start_generate_time = time.time()
generated_ids = model.generate(
**model_inputs,
max_new_tokens=512
)
end_generate_time = time.time()
generated_ids = [
output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
]
response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
end_total_time = time.time()
print(response)
print('总耗时:', end_total_time - start_time, 's')
开始运行
我们可以通过 vim 等编辑器把上面的代码写入到当前目录 run.py
中,写入完成以后我们可以尝试执行:
python run.py
运行之后会开始下载模型,下载完成之后我们会发现报错了,信息是:RuntimeError: unable to mmap 3554214621 bytes from file </root/.cache/modelscope/hub/deepseek-ai/DeepSeek-R1-Distill-Qwen-1___5B/model.safetensors>: Cannot allocate memory (12)
,这是因为运行内存不够写入我们的模型,这也是我们在这台 2 核心 2 GB 运行内存的 ECS 上运行这个模型的最大的障碍。此时我们可以参考我以前的《Linux系统添加 swap 空间》添加 SWAP 空间,swap的最大作用就是在内存不足的时候使用硬盘空间代替内存。
因为模型大概是 3.7 个 G 左右,所以我们可以直接添加 4 G 的 swap,我们可以通过以下指令来进行:
dd if=/dev/zero of=swapfile bs=1M count=4096
mkswap swapfile
swapon swapfile
这里创建的 swap 空间只是临时 swap,在服务器重启之后要手动启动才能继续使用,如果想要自动挂载 swap 空间可以参考上面提到的文章。
在创建好 swap 空间之后我们可以再次运行我们的 run.py
:
python run.py
我们可以发现已经成功运行了,效果如图:
这个时候只要我们输入我们的 prompt 就可以开始跑 deepseek 了,但是在运行前请做好心理准备,因为我们使用的是 swap 空间来存我们的模型,也就是使用的是硬盘,其相比内存可谓是蜗牛般的速度,所以跑出结果的过程需要很久的时间(大概4个小时),如果一直挂着 SSH 终端的话很可能其间就掉线了然后结果就没了,所以建议各位此处先按 Ctrl + C
退出。
我们可以使用 screen
来帮助我们保持进度,我们先来安装一下:
apt install -y screen
我们可以通过这个命令创建一个名为 deepseek
的 screen:
screen -S deepseek
回车输入之后我们会发现我们进入了一个新的终端,在里面我们再来运行我们的 run.py
:
python run.py
这个时候我们剋有放心输入我们的 prompt 了,输入之后就开始了漫长的运行时间,我们可以通过按住 Ctrl + A + D
(顺序)来退出,如果要再进入的话可以在原先的命令行中输入:
screen -r deepseek
运行结果
经过差不多 4 个小时的煎熬等待,我们的模型终于是输出了:
可以看到总耗时是 15285 秒(4.2个小时),但是我们终究还是成功在这台 99 计划的 2 核心 2GB 的 ECS 中抛出了结果。相比于其他模型可能在跑的期间直接就卡死,或者规定一定要 GPU 才能跑起来,又或者需要极大的内存或者 CPU 跑需要及其漫长(几百个小时)的时间,我们可以看到 deepseek 确实能够在这么小的一台机器中成功运行,也证明了他的火爆是有真材实料的。
但是最后还是提醒一下各位,其实选一台 2 核心 4 GB 运行内存的 ECS 可能就能提升很大的速度了,所以如果不是自己想折腾的话就还是提升一下 ECS 的配置吧哈哈哈。