Plotting Guide
MMX Plotting
The MMX CUDA plotter is available at mmx-binaries. The source code for the plotter can be found at mmx-cuda-plotter. A CUDA GPU is required for plotting due to the compression resistant plot format, since plotting on CPU would take too long. The format is compression resistant, but not incompressible. The current plotter allows for compression of up to C15, which only gives a gain of 4.5% in rewards, but at the cost of significant CPU load. C10 can be farmed on most modern CPUs while still giving a gain of 3%. Larger capacity hard drives may struggle to seek quickly enough when full of k29 plots. Hence for drives over 16TB k30 is the minimum recommended size.
Available k-sizes with plotting requirements
K-Size | HDD Size (GiB) | SSD Size (GiB) | Full RAM (GiB) | Partial RAM (GiB) | Disk with Partial RAM (GiB) |
---|---|---|---|---|---|
K29 | 37 | 15 | 61 | 39 | 22 |
K30 | 75 | 30 | 116 | 68 | 46 |
K31 | 155 | 62 | 226 | 126 | 88 |
K32 | 320 | 128 | 446 | 246 | 177 |
Compression
The MMX CUDA Plotter supports compression levels C0 to C15. Farming compressed plots is currently only supported on CPU. However recomputing a full proof on HDD plots is only required when a good enough quality has been found, either to make a block or to make a partial. GPU recompute would only add a few extra percent of gains, at the cost of needing a (big) GPU to sit idle most of the time (in case of HDD plots). GPU recompute for farming lots of (uncompressed) SSD plots is planned, as this is the only use case where it makes sense. Since SSD plots always need to recompute the proof output hash (quality), meaning the compute load is proportional to number of plots.
HDD Plots
C15 is possible to farm on CPU, but only with ~64 cores or more. It is not recommended to use C15 as the gain over C10 is minimal (1.5%). C10-C12 can be handled by most modern CPUs. C5 can be farmed on almost any CPU, with minimal power draw. When making NFT plots, it is recommended to use a lower C level (3-5 levels lower) since more proofs need to be computed when pooling (one for each partial). The compute load when farming HDD plots is independent of the number of plots. The challenge is computing a full proof fast enough to make a block or partial in time.
SSD Plots
SSD plots are 2.5x smaller than HDD plots. They cannot be farmed on HDDs (even in a RAID array) due to the high IOPS required to farm them (proportional to plot count). The CPU load to farm SSD plots is already quite high with C0, as such C0 is recommended when making SSD plots. Higher k-size reduces CPU and IOPS load. As such the most efficient SSD plots are k32 C0, with k29 having 8x higher CPU and IOPS load. k32 C3 is equal to k29 C0 in terms of CPU load. Farming 1024 uncompressed SSD plots is the same compute load as computing a single C10 full proof.
Benchmark
Before plotting with compression a benchmark should be performed to check if your system can handle it:
mmx_posbench -k 31 -C 10 # to benchmark k31 C10mmx_posbench --cuda 0 -k 31 -C 10 # to benchmark on CPUmmx_posbench --devices 1 2 -k 31 -C 10 # to select specific CUDA devices (starting at 0)
Creating Plots
To create plots you will need a Farmer Public Key, and optionally a PlotNFT contract address (for NFT plots). To get the Farmer Public Key, see mmx wallet keys
or go to the Info
tab under the wallet in the GUI.
For PlotNFT contract address, see Pooling.
Command Line Reference
To use the plotter via command line, navigate to the directory containing the plotter binaries and run the following command (replace mmx_cuda_plot_k30
with the appropriate binary for your desired k-size):
For full Ram plotting, -t
is used to temporarily store the the finished plot before moving it to the destination -d
, RAM is used for the entire plotting process.
./mmx_cuda_plot_k30 -C 5 -n -1 -t /mnt/tmp_ssd/ -d /mnt/farmdrive/ -f <farmer_key>
For partial RAM plotting, -2
is used to store temporary working files before moving the finished plot to -t
and then to -d
. RAM is used for the most write intensive parts of the plotting process. If -t
is not specified, the plotter will set the -t
argument to the same value as -2
.
./mmx_cuda_plot_k30 -C 5 -n -1 -t /mnt/tmp_ssd/ -2 /mnt/tmp_ssd/ -d /mnt/farmdrive/ -f <farmer_key>
For disk mode plotting, -3
takes the place of RAM and is used for write intensive temporary files. You can use a different drive for -2
if desired, the faster of the two drives should be used for -3
. If -2
or -t
are not specified, the plotter will set the value of both to the same value as -3
.
./mmx_cuda_plot_k30 -C 5 -n -1 -t /mnt/tmp_ssd/ -2 /mnt/tmp_ssd/ -3 /mnt/tmp_ssd/ -d /mnt/farmdrive/ -f <farmer_key>
To send finished plots to multiple destinations, use the -d
argument multiple times. For example:
./mmx_cuda_plot_k30 -C 5 -n -1 -t /mnt/tmp_ssd/ -d /mnt/farmdrive1/ -d /mnt/farmdrive2/ -f <farmer_key>
Full Command Line Reference options:
Usage: mmx_cuda_plot [OPTION...]
-C, --level arg Compression level (0 to 15) --ssd Make SSD plots -n, --count arg Number of plots to create (default = 1, unlimited = -1) -g, --device arg CUDA device (default = 0) -r, --ndevices arg Number of CUDA devices (default = 1) -t, --tmpdir arg Temporary directories for plot storage (default = $PWD) -2, --tmpdir2 arg Temporary directory 2 for partial RAM / disk mode (default = @RAM) -3, --tmpdir3 arg Temporary directory 3 for disk mode (default = @RAM) -d, --finaldir arg Final destinations (default = <tmpdir>, remote = @HOST) -z, --dstport arg Destination port for remote copy (default = 1337) -w, --waitforcopy Wait for copy to start next plot -c, --contract arg Pool Contract Address (62 chars) -f, --farmerkey arg Farmer Public Key (33 bytes) -S, --streams arg Number of parallel streams (default = 3, must be >= 2) -B, --chunksize arg Bucket chunk size in MiB (default = 16, 1 to 256) -Q, --maxtmp arg Max number of plots to cache in tmpdir (default = -1) -A, --copylimit arg Max number of parallel copies in total (default = -1) -W, --maxcopy arg Max number of parallel copies to same HDD (default = 1, unlimited = -1) -M, --memory arg Max shared / pinned memory in GiB (default = unlimited) --version Print version -h, --help Print help