如何增加Ubuntu的虚拟内存?

背景

在配置服务器以运行llama3-8b-instruct的过程中出现内存空间不足的提示:

"/usr/local/lib/python3.10/dist-packages/transformers/modeling_utils.py", line 508, in load_state_dict
    with safe_open(checkpoint_file, framework="pt") as f:
RuntimeError: unable to mmap 4976698672 bytes from file </mnt/vdb1/LLM/LLM-Research/Meta-Llama-3-8B-Instruct/model-00001-of-00004.safetensors>: Cannot allocate memory (12)

问题

如何增加虚拟内存以便满足llama3-8b-instruct的内存需求?

方案

命令行知识

dd命令

名称来源

  • dd命令的名称来自于“数据传输(Data Definition)”的缩写。尽管原始名称可能令人困惑,但实际上它被广泛用于复制和转换文件,而不仅仅是定义数据结构。

使用方式

dd是一个用于复制和转换文件的命令行工具。它的基本语法是

dd if=<input-file> of=<output-file> bs=<block-sezi> count=<number-of-blocks>

,其中if表示输入文件(input file),of表示输出文件(output file),bs表示块大小(block size),count表示块数(number of blocks)。

du 命令

du命令是在Linux系统上用来显示文件和目录磁盘使用情况的命令。du表示"disk usage"。使用du命令可以显示指定文件或目录所占用的磁盘空间大小。如果不指定文件或目录,du命令默认显示当前目录下所有文件和子目录的磁盘使用情况。

du命令的基本语法是:

du [OPTION]... [FILE]...

一些常用的选项包括:

  • -h : 以人类可读的格式显示文件和目录的磁盘使用情况,如KB, MB, GB等。
  • -s : 仅显示指定文件或目录的总磁盘使用情况,而不显示子目录的详细情况。
  • -c : 显示总计磁盘使用情况,包括所有指定文件或目录的总和。

例如,使用du -sh /home/user1命令可以显示/home/user1目录的总磁盘使用情况,并使用人类可读的格式显示大小。

mkswap 命令

mkswap命令的基本语法是:

mkswap [OPTION]... DEVICE

其中,DEVICE可以是一个分区设备文件(如/dev/sda1)或者一个普通文件。

一些常用的选项包括:

  • -c : 在创建交换区域时,进行检查并保留坏扇区的信息。
  • -f : 强制创建交换区域,即使设备似乎被正在使用。

例如,执行mkswap /dev/sdb1命令可以将/dev/sdb1分区设备文件初始化为交换分区。初始化完成后,可以使用swapon命令将其添加到系统中,使其生效。

swapon/swapoff 命令

swapon和swapoff是Linux系统中用于启用和禁用交换分区或交换文件的命令。

swapon命令用于将指定的交换分区或交换文件激活,使其可以用作系统内存的扩展。其基本语法为:

swapon [OPTION]... DEVICE

其中,DEVICE可以是一个分区设备文件(如/dev/sda1)或者一个普通文件。使用swapon命令激活交换分区后,系统将开始在交换空间中进行交换和页面置换,从而扩展可用的虚拟内存空间。

swapoff命令用于禁用指定的交换分区或交换文件,将其从系统中移除,使其不再用作虚拟内存。其基本语法为:

swapoff [OPTION]... DEVICE

类似于swapon,DEVICE可以是一个分区设备文件或者一个普通文件。

例如,执行swapon /dev/sdb1命令可以将/dev/sdb1分区设备文件激活为交换分区,而执行swapoff /dev/sdb1命令可以将其禁用,停止使用作为交换分区。

这两个命令在管理系统内存和交换空间时非常有用,可以根据系统需求动态地调整和管理交换空间的使用。

free -mh

free -mh命令用于在Linux系统中显示系统内存的使用情况,以及交换空间的情况。该命令会以人类可读的方式显示内存和交换空间的使用情况。

具体来说,-m选项表示以MB为单位显示内存使用情况。

-h选项则表示以人类可读的格式显示内存大小,使用类似"1.2G"的形式。

举个例子,执行free -mh命令会以人类可读的格式显示系统内存和交换空间的使用情况,包括总内存、已使用内存、剩余内存,以及交换空间的情况

磁盘知识

/dev/zero

/dev/zero是一个特殊的设备文件,在Unix和类Unix操作系统中用于提供无限的字节零流。读取/dev/zero将始终返回无限的零字节流,而写入/dev/zero则会将写入的数据丢弃,因为写入的数据都是字节零。

这个设备文件在很多情况下非常有用,例如当需要创建一个特定大小的空文件时,可以使用dd命令来将/dev/zero的数据写入到文件中,然后再截断文件到所需的大小。

过程

步骤一:创建空文件30G

dd if=/dev/zero of=/mnt/vdb1/ bs=1M count=30240

步骤二:根据空文件制作交换空间

mkswap /mnt/vdb1

步骤三:启用交换空间

swapon /mnt/vdb1

步骤四:查看交换空间

free -mh

评价

通过重新设置交换空间的大小,可以将硬盘的一部分用于扩展linux服务器的内存大小。从而为内存需求量过高的程序如llama的运行提供解决方案。

参考

posted @ 2024-06-09 09:43  Laziko  阅读(6)  评论(0编辑  收藏  举报