spacemesh标准部署教程

话不多说,整理部署运行过程

1. 环境配置

  1. 操作系统:推荐ubuntu 22.04 一定用这个版本,别的版本也能跑,但各种毛病合配置,会让你抓狂
  2. 显卡:4070、3080等
  3. 驱动:ubuntu官方方式直接安装显卡
  4. 内存:32G起步
  5. 硬盘:除了系统盘。要P多大的盘,根据自己需要考量。最小需要256G。想省成本,可以用机械盘。固态盘主要是扫盘时候效率高,p盘没多大区别

1.1 环境说明

这块踩了很多坑,开始这个项目前,一定要先确保环境没有问题。其实最大的问题,就是显卡驱动。这个要没问题,那基本就都没什么事了。整理了下相关命令,具体如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# 1. 新装系统
带有独显的设备重装系统,需要明白,ubuntu自带的显卡驱动nouveau可能会导致你无法重装,或者装上无法启动,如果开机有提示这个驱动导致你无法进入系统,那就参考网上的解决方案吧。
我的解决方式是,在重装启动时,按ESC键,当画面让你选择哪种方式启动装系统时,一般选择第一种(不要回车),然后键盘按E,添加一行内容:splash nouveau.modeset=0 ,然后键盘按F10,正常就能进入系统或者安装系统了。
每次开机或者装机,都这样操作。进入系统后,需要将nouveau加入黑名单,具体往上找找吧,大体如下:
sudo vim /etc/modprobe.d/blacklist-nouveau.conf
输入内容:
blacklist nouveau
options nouveau modeset=0
生效:
sudo update-initramfs -u
重启系统:
reboot

# 2. 检测ubuntu驱动并安装
apt-get update
ubuntu-drivers devices
选择标记recommand的那个版本(我是这样成功的,你需要根据自己实际情况考量,可前往https://www.nvidia.cn/Download/index.aspx?lang=cn 检查你的卡是否支持)然后安装,比如535:
建议此种方式安装,可以最大限度减少没必要的文件
sudo apt-get install nvidia-driver-535
重启
reboot

# 3. 检测显卡驱动是否安装成功
如果有数据,则驱动安装成功,只是安装成功,但能否满足项目需要,还要看下一步
nvidia-smi

# 4. 安装clinfo
sudo apt install clinfo
执行下方命令检测,如果能够输出你的显卡信息,那你的环境基本就没问题了。这个命令是最关键的一步,我在这里卡了好几天,一直什么数据都不显示。最后发现是有一张显卡有问题,拔掉后就正常了。
clinfo -l

# 5. 安装其余依赖(务必安装)
sudo apt update && sudo apt install -y git git-lfs make curl build-essential unzip wget ocl-icd-opencl-dev unzip libudev-dev

# 6. 可选
# p盘完成后,如果后续在没有显卡的设备,或者没有进行过上述安装的设备中进行扫盘,则需要进行如下安装。该方式主要是针对类似如下案例情况下的。
# 比如,nfs形式,计算和存储分离,计算设备p完存储设备的盘后,想要用存储设备的cpu扫盘,那存储设备就需要:
sudo apt install mesa-opencl-icd
sudo apt-get install clinfo

正常情况下,新系统,如上四个步骤就够了。别的诸如cuda、intel什么的,都不需要安装。
如果第4步实在显示不出信息,而第3步又正常,这种时候建议检查下硬件,逐个排查,深刻的教训。

1.2 挂载硬盘

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 查看空间情况
lsblk

# 格式化硬盘
sudo mkfs.ext4 /dev/sdb

# 创建一个目录用于挂载
sudo mkdir /data

# 硬盘挂载到目录
sudo mount /dev/sdb /data

# 默认情况下,新挂载的硬盘,系统会自动保留5%的空间,为了充分利用这5%空间,可以做如下设置,比如只保留1%:
tune2fs -m 0.01 /dev/sdb

# (可选)这种挂载,系统重启后,就会消失,想要永久挂载,继续如下操作:
## 查看uuid并记录
blkid /dev/sdb
## 将uuid信息写入文件
vim /etc/fstab
## 新增内容:
/dev/disk/by-uuid/{uuid} /data ext4 defaults 0 1

重启,检查硬盘是否正常
reboot

测试磁盘读写速度,这个涉及到你扫盘时候面临的问题,因此,你一定要测速,先心里有个底。
因为扫盘时,要确保你能够在12个小时内扫描结束,为此,你一定要计算好你磁盘读写大小以及你p的文件大小
这篇文章,针对这个,我专门提醒了3次。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 方式1
# 安装工具
sudo apt-get install hdparm

# 查看磁盘
lsblk

# 测试
sudo hdparm -Tt /dev/指定磁盘

# 方式2 推荐
# 安装工具
apt-get install sysstat
# 测试 5秒一次
iostat -dmt /dev/sdb 5

# 方式3
# 直接手动读写几个G文件
#
time dd if=/dev/zero of=/data/testfile bs=8k count=307200
#
time dd if=/data/testfile of=/dev/null bs=8k count=307200

1.3 其余命令汇总

下面👇这里我再将我调试期间用到的命令,都汇总一下,方便以后自己查阅,这些命令没必要看,项目也用不到,除非你想了解了解:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# 显卡驱动,可前往nvidia官方下载run文件驱动
安装驱动
sudo bash xxx.run
卸载驱动
sudo bash xxx.run --uninstall

# 提示apply command not found,则安装:
apt-get install alsa-utils

# 查看当前显卡硬件有哪些
lspci | grep VGA

# 查看系统内核
ubuntu22.04的默认好像是5.15
uname -r

# 查看ubuntu的发行版本
lsb_release -a

# 查看apt安装的关于nvidia有哪些
apt list --installed | grep nvidia

# 查找nvidia驱动
sudo apt search nvidia-driver

# 自动安装显卡驱动
这会安装很多东西
sudo ubuntu-drivers autoinstall

# 卸载显卡驱动
sudo apt-get --purge remove *nvidia*
sudo apt autoremove
sudo apt autoclean
#卸载cuda
sudo apt-get --purge remove "*cublas*" "cuda*"
# 如果以官方的run方式安装的驱动,则可以用安装包来卸载
sudo xx.run --unistall

# 其余一些icd支持
项目需要的是nvidia-opencl-icd,这个在驱动安装时候,就会自动安装,你也单独安装不了。下面的是我测试期间各种尝试安装的。
最后,你会在/etc/OpenCl/vender/目录中看到各种icd,可以cat看看具体内容

sudo apt install pocl-opencl-icd
sudo apt install mesa-opencl-icd
sudo apt install ocl-icd-opencl-dev
sudo apt install ocl-icd-libopencl1
sudo apt install opencl-headers
sudo apt install intel-opencl-icd

# 本机名称变更
注意同时更改hosts中的本机名称
hostnamectl set-hostname xxx

2. spacemesh项目文件准备

下面三个程序,是后面命令要用到的,这个需要预先准备好
官方工具最新版下载(当然可以自己编译,只要你有精力):

  1. 钱包工具:smcli
  2. p盘工具:postcli
  3. 节点工具:spacemesh

3. 创建钱包并记录信息

使用前面准备的smcli程序
这一过程,一定要记录好自己的账户信息,包括账户地址。后续产生的收益全在这里面了。
地址后续的配置要用到

1
2
3
4
5
./smcli wallet create
# 记录复制好钱包地址,后面要用,这里假设钱包地址是:sm1xxxxxxx
# 会显示钱包信息,助记词什么的,还有文件位置都记录好。比如提示的文件位置:xxx/xxx/xxx.json
# 也可以可执行该命令打开文件,获取钱包信息
./smcli wallet read xxx/xxx/xxx.json

4. 计算p盘需要的数据

  1. 因为扫盘期间,要确保你能够在12个小时内扫描结束,为此,你一定要计算好你磁盘读写大小以及你p的文件大小,请务必牢记这句话,因为试错成本太高
  2. 使用前面准备的postcli程序,这个过程的目的是计算出你总共要生成多少个文件
  3. 先说下规则:
    SpaceMesh是以numUnits为基本的存储单元,每个numUnits64G(这个值固定不变),P好的文件是postdata_xxx.bin格式的文件,文件大小取决于postcli启动时-maxFileSize参数指定的文件大小,默认是4G
  4. 按我的理解,一个bin文件的大小是64的整数倍,检索什么的效率应该会更高。但还需要考虑个人实际情况。比如你p盘完了,要传输或者拷贝文件,太大了反而成为负担。再比如,你多卡p盘时,想更细力度划分各卡p的范围。具体要多大,自己来衡量吧。
  5. 根据规则,其实我们只需要更改numUnits-maxFileSize参数即可,计算出最终需要多少文件,是我们最关心的。
  6. 举个例子来解释这个过程:
1
2
3
4
5
6
7
8
9
# 比如你要p盘1152G(`需要时64的倍数`,最少需要p盘256G),则`numUnits`=1152/64=`18`,就是说,你总共要p出18个单位(注意,不是文件数量)

# -maxFileSize默认,即4G,不配置,执行命令
./postcli -numUnits 18 -printNumFiles
# 此时得到结果288,表示按现有参数最终你磁盘会生成288个4G的文件

# -maxFileSize改为32G,需要折算成字节byte,为34359738368,再次执行命令
./postcli -numUnits 18 -maxFileSize=34359738368 -printNumFiles
# 此时得到结果36,表示按现有参数最终你磁盘会生成36个4G的文件,明显比默认值时候,生成的文件小很多

如果你打算多显卡p同一个盘,生成文件的数量一定要记录好,具体后续会做进一步讲解。

5. 单机p盘

这个过程分为单机单卡p盘,或者单机多张卡并行p盘。说白了就是,假设你要p个256G,一张卡把256G从头p到尾,还是用多张卡把这256G划分到多张卡上p盘,后者显然效率更高,只要你有条件。
单机多张卡并行p盘的实现,是在单机单卡p盘的基础上实现的。
因此,我们先讲讲如何进行单机单卡p盘
:看懂了单机多张卡并行p盘,那即使显卡不在同一个机器上,也可以用相似方法搞。只是最近传输合并数据会比较麻烦。这个衍生的用法,文中我就不说了,自行探索吧。

5.1 单机单卡p盘

使用前面准备的go-spacemesh程序
这个其实很简单,一条命令就够了

1
./go-spacemesh --config config.mainnet.json --smeshing-start --smeshing-coinbase sm1xxxxxxx --smeshing-opts-numunits 18 -maxFileSize=34359738368 --smeshing-opts-provider 0 --smeshing-opts-datadir /mnt/spacemesh/post_data --data-folder /mnt/spacemesh/node_data

解释下:
--config: 节点配置文件,通过wget https://smapp.spacemesh.network/config.mainnet.json 获取,这个是官方的配置,可视化版本还是程序,都用这同一个配置,看着貌似是创世的配置以及网络节点的配置,具体内容我也没研究;
--smeshing-start: 启动P盘,如果不加此选项,则只同步节点,不会启动P盘,也不会生成postdata_metadata.json
--smeshing-coinbase: 收益地址,sm1开头,通过smcli创建,就是前面让你记录的地址;
--smeshing-opts-numunits: P盘的单元数量,和前面postcli计算的-numUnits值必须相等;
--smeshing-opts-maxfilesize: 生成一个文件的大小,不能超过该值,用byte;
--smeshing-opts-provider: 指定用显卡还是CPU,P盘时用显卡,参数值为显卡ID0、1、2…,比如你用nvidia卡,nvidia-sim命令,返回结果第一列就是ID;
--smeshing-opts-datadir: P盘文件存储路径;
--data-folder: 节点文件存储路径;

5.2 单机多卡p盘

使用前面准备的postcli程序。
这个原理就是:使用你前面计算的文件数量,根据显卡计算能力,把文件划分给不同的卡去p。比如你算出总共能生成10个文件,编号0到9,3张卡。你可以给计算能力强的0号卡分配前5个文件编号,计算适中的1号卡分配3个文件编号,计算最差的2号卡分配2个文件编号。
然后配合节点参数,启动p盘

5.2.1 获取commitmentAtxId值

该值为提交PoET证明的地址
单机单卡p盘启动后,新开一个窗口,执行命令:

1
./grpcurl -plaintext -d '' 127.0.0.1:9092 spacemesh.v1.ActivationService.Highest | jq -r '.atx.id.id' |  base64 -d | xxd -p -c 32

记录下这个输出值,这个值就是后面会用到的-commitmentAtxId
此时,就请务必关掉单机单卡p盘运行的程序了

注: grpc下载地址:下载

5.2.2 获取id值

这是节点地址
执行命令:

1
cat /data/post_data/postdata_metadata.json | jq -r '.NodeId' |  base64 -d | xxd -p -c 32

关于postdata_metadata.json我解释下,单机单卡p盘启动后,会在启动用的参数--smeshing-opts-datadir中生成该文件,还有另一个key文件
记录下这个输出值,这个值就是后面会用到的-id
/mnt/spacemesh/post_data/目录只要保留key--smeshing-opts-datadir文件,其余的建议都删除掉

5.2.3 启动p盘

获取前面生成的commitmentAtxIdid参数
比如有3张卡,则:

1
2
3
nohup ./postcli -provider=0 -commitmentAtxId=${commitmentAtxId} -id=${id} --smeshing-opts-numunits 18 -maxFileSize=34359738368 -fromFile=0 -toFile=5 -datadir=/mnt/spacemesh/post_data > 0.log &
nohup ./postcli -provider=1 -commitmentAtxId=${commitmentAtxId} -id=${id} --smeshing-opts-numunits 18 -maxFileSize=34359738368 -fromFile=6 -toFile=11 -datadir=/mnt/spacemesh/post_data > 1.log &
nohup ./postcli -provider=2 -commitmentAtxId=${commitmentAtxId} -id=${id} --smeshing-opts-numunits 18 -maxFileSize=34359738368 -fromFile=12 -toFile=17 -datadir=/mnt/spacemesh/post_data > 2.log &

其中nohup xxx > 0.log 表示后台运行,同时打印出日志,不想要的话,直接撤了就行

其余参数我简单解释下:
--provider: 指定用显卡还是CPU,P盘时用显卡,参数值为显卡ID0、1、2…,比如你用nvidia卡,nvidia-sim命令,返回结果第一列就是ID;
--commitmentAtxId: 提交PoET证明的地址;
--id: 节点id;
--smeshing-opts-numunits: P盘的单元数量,和前面postcli计算的-numUnits值必须相等;
---maxFileSize: 生成一个文件的大小,不能超过该值,用byte。如果不填,默认一个文件大小4GB,即4294967296;
---fromFile: 根据p盘原理,选择从哪个文件编号开始p;
---toFile: 根据p盘原理,选择p到哪个文件编号为止;
---datadir: p的文件存储的位置,同一台机子,不同卡都可以把文件指向同一个目录,如果每张卡指向不同目录,那到时候合并数据时,你得把不同目录中,最小那个Nonce值变更到合并目录中;

如果你每张卡p在了不同目录,合并数据时,需要选择不同目录中最小的那个Nonce值,然后替换合并目录中postdata_metadata.json的Nonce值。
如果每张卡都p在同一目录,就什么也不用操作了,等着p完就行。

为了简化这个计算过程,避免每张卡计算失误,我开发了个脚本单机多卡快速部署脚本 ,把该脚本放在和postcli程序同一个目录下,直接执行,按照脚本提示完成操作即可。

5.3 验证

如果因为各种意外,导致P盘中断,是可以继续使用相同命令和参数继续P盘的,程序会自动跳过已经P好的盘。如果p完后,不放心盘是否完整,可以使用下面这个命令验证P盘是否正确:

1
2
3
# /post/data 表示p盘文件的目录,该目录下包含xxx.json和key
# 0.1表示,只验证0.1%的数据,说白了就是只抽取0.1%的数据去验证,毕竟完整验证是很消耗时间的
postcli -verify -datadir /post/data -fraction 0.1

5.4 总结

看懂了单机多张卡并行p盘,那即使显卡不在同一个机器上,也可以用相似方法搞。只是传输合并数据会比较麻烦。这个衍生的用法,文中我就不说了,自行探索吧。

6. 节点同步

p盘期间,根据我个人经验,建议可以同时启动节点同步,让节点先自行下载同步数据去,要不然等你p完了,还得等待节点同步。
节点同步的目录,一定是你前面p盘那会儿生成的节点目录。

1
./go-spacemesh --config config.mainnet.json --data-folder /mnt/spacemesh/node_data

7. 扫盘并提交证明

这个过程,要确保你能够在12个小时内扫描结束,为此,你一定要计算好你磁盘读写大小以及你p的文件大小

1
2
3
4
5
# 获取cpu编号
./postcli -printProviders

# 开始扫盘
./go-spacemesh --config config.mainnet.json --smeshing-start --smeshing-coinbase sm1xxxxxxx --smeshing-opts-numunits 16 --smeshing-opts-provider 4294967295 --smeshing-opts-datadir /data/post_data --data-folder /data/node_data

执行命令后:
当出现如下信息表示正在扫描文件(不是扫盘),该信息是你启动扫盘后,很快会出现的:

1
2
2023-07-23T15:57:24.849+0800	INFO	fb26a.post	initialization: file already initialized	{"node_id": "fb26a9d2da5626ded24027da14054bf0fbf8886bd7ec4a29d05ee2fdd44edddd", "module": "post", "fileIndex": 0, "currentNumLabels": 268435456, "targetNumLabels": 268435456, "startPosition": 0}
2023-07-23T15:57:24.849+0800 INFO fb26a.post initialization: file already initialized {"node_id": "fb26a9d2da5626ded24027da14054bf0fbf8886bd7ec4a29d05ee2fdd44edddd", "module": "post", "fileIndex": 1, "currentNumLabels": 268435456, "targetNumLabels": 268435456, "startPosition": 268435456}

当出现如下信息,表示开始生成证明文件,该信息是你启动扫盘后,很快会出现的:

1
2023-07-23T15:57:59.995+0800	INFO	fb26a.post calculating proof of work for nonces 0..144

等待十来二十分钟,检测磁盘读写,表示已经开始扫了:

1
iostat -dmt /dev/sdb 5

当出现如下信息,表示扫描结束,并在post_data目录生成post.bin文件:

1
2023-07-23T16:07:27.469+0800	INFO	fb26a.post	Found proof for nonce: 110, pow: 54043195528453627 with...

然后就是漫长的等待纪元时间点,链上自动注册,链上自动二次扫描(确保你没舞弊),获取收益,需要历经14天左右。
比如出现如下日志表示开始注册:

1
2023-08-21T07:00:00.743Z	INFO	c9d89.atxBuilder	atx challenge is ready

参考:

  1. 集群P盘教程 https://github.com/minerdao/posts/blob/master/spacemesh/cluster-mining-tutorial.md
  2. 显卡P盘脚本 https://github.com/minerdao/posts/blob/master/spacemesh/cluster-mining-tutorial.md
  3. 多显卡P盘教程 https://simeononsecurity.ch/other/efficient-spacemesh-mining-multiple-gpus-guide/#linux
  4. GPU post https://github.com/spacemeshos/gpu-post
Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2017-2023 Jason
  • Visitors: | Views:

谢谢打赏~

微信