Recipes

Base Setup

salloc  -w "cn-d[003-004]" --ntasks=1 --gpus-per-task=a100l:8 --exclusive --nodes=1 --cpus-per-task=128 --time=120:00:00 --ntasks-per-node=1 --mem=0
cd /tmp/
mkdir milabench
cd milabench
git clone https://github.com/mila-iqia/milabench.git

conda activate base
python --version
Python 3.11.4

virtualenv ./env
source ./env/bin/activate
pip install -e milabench/

export MILABENCH_WORDIR="$(pwd)"
export MILABENCH_BASE="$MILABENCH_WORDIR/results"
export MILABENCH_CONFIG="$MILABENCH_WORDIR/milabench/config/standard.yaml"
export BENCHMARK_VENV="$MILABENCH_WORDIR/results/venv/torch"

module load cuda/12.3.2                                          # <= or set CUDA_HOME to the right spot

milabench install
milabench prepare
milabench run

The current setup runs on 8xA100 SXM4 80Go. Note that some benchmarks do require more than 40Go of VRAM. One bench might be problematic; rwkv which requires nvcc but can be ignored.

Increase Runtime

For profiling it might be useful to run the benchmark for longer than the default configuration. You can update the yaml file (config/base.yaml or config/standard.yaml) to increase the runtime limits. There is two values that govern the runtime of a benchmark max_duration which is a pure timeout to avoid benchmark hangs and voir.options.stop which represent the target number of observations milabench will gather before stopping.

_defaults:
  max_duration: 600           # <= Maximum number of seconds the bench can run
  voir:                       # note that if this triggers the bench is marked as failed
    options:
      stop: 60                # <= Maximum number of observation we are gathering
      interval: "1s"          # This is usually what triggers the premature exit of the benchmark
                              # an observation is usually a batch forward/backward/optimizer.step (i.e one train step)

One Env

If your are using a container with dependencies such as pytorch already installed, you can force milabench to use a single environment for everything.

milabench install --use-current-env
milabench prepare --use-current-env
milabench run --use-current-env --select bert-fp32

Batch resizer

If the GPU you are using has lower VRAM automatic batch resizing could be enabled with the command below. Note that will not impact benchmarks that already use a batch of one, such as opt-6_7b and possibly opt-1_3b.

MILABENCH_SIZER_AUTO=1 milabench run

Device Select

To run on a subset of GPUs (note that by default milabench will try to use all the GPUs all the time which might make a run take a bit longer, reducing the number of visible devices to 2 might make experimentation faster)

CUDA_VISIBLE_DEVICES=0,1,2,3 milabench run

Update Package

To update pytorch to use a newer version of cuda (milabench creates a separate environment for benchmarks)

# can be executed after `milabench install` at the earliest
source $BENCHMARK_VENV/bin/activate
pip install -U torch torchvision torchaudio

Arguments

If environment variables are troublesome, the values can also be passed as arguments.

milabench install --base $MILABENCH_BASE --config $MILABENCH_CONFIG
milabench prepare --base $MILABENCH_BASE --config $MILABENCH_CONFIG
milabench run --base $MILABENCH_BASE --config $MILABENCH_CONFIG

To help us troubleshoot future issues, you can forward your result directory. It holds all the benchmark specific logs and metrics gathered by milabench.

zip -r results.zip results

Run a benchmark without milabench

milabench dev {benchname}  # will open bash with the benchmark venv sourced

# alternatively

source $MILABENCH_BASE/venv/torch/bin/activate

Containers

When using containers where some dependencies are already installed, we need to use a dummy virtualenv so make milabench install its dependencies there, then the duplicate dependencies can be removed.

podman run --rm --device nvidia.com/gpu=all --storage-opt ignore_chown_errors=true --security-opt=label=disable --ipc=host -it -e HOME=$HOME -e USER=$USER -v $HOME:$HOME  nvcr.io/nvidia/pytorch:24.02-py3

cd $HOME
rm -rf env
pip install virtualenv

# Create a virtual env with system packages to get the container's pytorch
virtualenv --system-site-packages env
source ./env/bin/activate
git clone https://github.com/mila-iqia/milabench.git
pip install -e milabench

export MILABENCH_BASE="$HOME/results"
export MILABENCH_CONFIG="$HOME/milabench/config/standard.yaml"
export MILABENCH_GPU_ARCH=cuda

# This updates the requirements for cuda
# milabench pin --from-scratch --variant cuda -c constraints/cuda.txt

# Install the new requirements (note: this will still install a new pytorch)
milabench install --use-current-env

# uninstall pytorch that was installed in the venv
# so we use the system packages instead
pip uninstall torch torchvision torchaudio

milabench prepare --use-current-env
milabench run --use-current-env

Example Reports

8xA100 SXM4 80Go

milabench run
=================
Benchmark results
=================
bench                          | fail | n |       perf |   sem% |   std% | peak_memory |      score | weight
bert-fp16                      |    0 | 8 |     154.92 |   0.3% |   4.5% |       28500 |    1240.06 |  0.00
bert-fp32                      |    0 | 8 |      29.55 |   0.0% |   0.5% |       35464 |     236.54 |  0.00
bert-tf32                      |    0 | 8 |     120.02 |   0.3% |   4.9% |       35466 |     960.04 |  0.00
bert-tf32-fp16                 |    0 | 8 |     154.87 |   0.3% |   4.5% |       28500 |    1239.70 |  3.00
bf16                           |    0 | 8 |     293.43 |   0.3% |   7.2% |        5688 |    2363.29 |  0.00
convnext_large-fp16            |    0 | 8 |     247.31 |   2.4% |  37.6% |       31362 |    1986.27 |  0.00
convnext_large-fp32            |    0 | 8 |      45.58 |   0.7% |  11.5% |       53482 |     360.90 |  0.00 ** High memory **
convnext_large-tf32            |    0 | 8 |     117.54 |   1.2% |  18.8% |       53482 |     940.03 |  0.00 ** High memory **
convnext_large-tf32-fp16       |    0 | 8 |     214.41 |   2.9% |  46.4% |       31362 |    1713.47 |  3.00
davit_large                    |    0 | 8 |     308.33 |   0.3% |   7.3% |       37900 |    2475.47 |  1.00
davit_large-multi              |    0 | 1 |    2242.69 |   2.0% |  15.2% |       45610 |    2242.69 |  5.00 ** High memory **
dlrm                           |    0 | 1 |  398088.30 |   2.5% |  19.3% |        7030 |  398088.30 |  1.00
focalnet                       |    0 | 8 |     391.21 |   0.3% |   6.8% |       29808 |    3143.46 |  2.00
fp16                           |    0 | 8 |     289.62 |   0.2% |   4.8% |        5688 |    2327.60 |  0.00
fp32                           |    0 | 8 |      19.13 |   0.0% |   1.3% |        6066 |     153.20 |  0.00
llama                          |    0 | 8 |     496.84 |   4.4% |  79.2% |       32326 |    3778.17 |  1.00
opt-1_3b                       |    0 | 1 |      28.23 |   0.1% |   0.4% |       45976 |      28.23 |  5.00 ** High memory **
opt-6_7b                       |    0 | 1 |      14.22 |   0.0% |   0.1% |       57196 |      14.22 |  5.00 ** High memory **
reformer                       |    0 | 8 |      61.45 |   0.0% |   1.0% |       29304 |     492.17 |  1.00
regnet_y_128gf                 |    0 | 8 |      82.25 |   0.3% |   6.8% |       35454 |     658.46 |  2.00
resnet152                      |    0 | 8 |     669.61 |   0.4% |   9.6% |       37878 |    5378.33 |  1.00
resnet152-multi                |    0 | 1 |    5279.39 |   1.2% |   9.2% |       42532 |    5279.39 |  5.00 ** High memory **
resnet50                       |    0 | 8 |     456.63 |   3.0% |  66.1% |        8630 |    3620.48 |  1.00
rwkv                           |    8 | 8 |        nan |   nan% |   nan% |        5458 |        nan |  1.00
stargan                        |    0 | 8 |      34.07 |   2.1% |  45.4% |       41326 |     271.44 |  1.00
super-slomo                    |    0 | 8 |      35.55 |   1.4% |  30.7% |       37700 |     285.19 |  1.00
t5                             |    0 | 8 |      47.77 |   0.2% |   4.0% |       39344 |     382.20 |  2.00
tf32                           |    0 | 8 |     147.05 |   0.2% |   4.9% |        6066 |    1181.93 |  0.00
whisper                        |    0 | 8 |     145.26 |   2.2% |  48.3% |       40624 |    1160.69 |  1.00

 Scores
 ------
 Failure rate:       4.06% (FAIL)
 Score:             567.57

 Errors
 ------
 8 errors, details in HTML report

4xA100 SXM4 80Go

CUDA_VISIBLE_DEVICES=0,1,2,3 milabench run
=================
Benchmark results
=================
bench                          | fail | n |       perf |   sem% |   std% | peak_memory |      score | weight
bert-fp16                      |    0 | 4 |     154.86 |   0.4% |   4.5% |       28500 |     619.75 |  0.00
bert-fp32                      |    0 | 4 |      29.58 |   0.0% |   0.5% |       35464 |     118.38 |  0.00
bert-tf32                      |    0 | 4 |     119.99 |   0.4% |   4.4% |       35466 |     480.05 |  0.00
bert-tf32-fp16                 |    0 | 4 |     155.04 |   0.4% |   4.6% |       28500 |     620.50 |  3.00
bf16                           |    0 | 4 |     293.40 |   0.3% |   6.6% |        5688 |    1180.12 |  0.00
convnext_large-fp16            |    0 | 4 |     265.18 |   2.8% |  30.6% |       31362 |    1065.59 |  0.00
convnext_large-fp32            |    0 | 4 |      46.35 |   1.3% |  14.2% |       53482 |     182.25 |  0.00  ** High memory **
convnext_large-tf32            |    0 | 4 |     122.58 |   1.4% |  15.9% |       53482 |     490.00 |  0.00  ** High memory **
convnext_large-tf32-fp16       |    0 | 4 |     295.47 |   2.1% |  22.8% |       31362 |    1191.62 |  3.00
davit_large                    |    0 | 4 |     310.47 |   0.4% |   6.5% |       38144 |    1247.04 |  1.00
davit_large-multi              |    0 | 1 |    1183.76 |   1.1% |   8.2% |       45336 |    1183.76 |  5.00 ** High memory **
dlrm                           |    0 | 1 |  430871.61 |   2.6% |  20.2% |        7758 |  430871.61 |  1.00
focalnet                       |    0 | 4 |     391.96 |   0.4% |   6.4% |       29812 |    1575.26 |  2.00
fp16                           |    0 | 4 |     289.99 |   0.2% |   4.1% |        5688 |    1164.13 |  0.00
fp32                           |    0 | 4 |      19.13 |   0.0% |   0.9% |        6066 |      76.58 |  0.00
llama                          |    0 | 4 |     492.72 |   6.2% |  78.3% |       32326 |    1884.58 |  1.00
opt-1_3b                       |    0 | 1 |      14.45 |   0.0% |   0.2% |       46016 |      14.45 |  5.00 ** High memory **
opt-6_7b                       |    0 | 1 |       5.96 |   0.0% |   0.1% |       75444 |       5.96 |  5.00 ** High memory **
reformer                       |    0 | 4 |      61.39 |   0.1% |   1.0% |       29304 |     245.83 |  1.00
regnet_y_128gf                 |    0 | 4 |      82.67 |   0.3% |   5.1% |       35454 |     330.98 |  2.00
resnet152                      |    0 | 4 |     672.09 |   0.4% |   6.9% |       39330 |    2694.83 |  1.00
resnet152-multi                |    0 | 1 |    2470.38 |   1.5% |  11.2% |       47288 |    2470.38 |  5.00 ** High memory **
resnet50                       |    0 | 4 |     454.49 |   3.2% |  50.5% |        8630 |    1800.61 |  1.00
rwkv                           |    4 | 4 |        nan |   nan% |   nan% |        5458 |        nan |  1.00
stargan                        |    0 | 4 |      42.30 |   1.9% |  29.9% |       53412 |     169.73 |  1.00 ** High memory **
super-slomo                    |    0 | 4 |      40.67 |   0.8% |  13.1% |       37700 |     163.08 |  1.00
t5                             |    0 | 4 |      47.74 |   0.3% |   3.9% |       39344 |     190.95 |  2.00
tf32                           |    0 | 4 |     146.72 |   0.2% |   4.0% |        6066 |     588.99 |  0.00
whisper                        |    0 | 4 |     207.47 |   1.0% |  15.4% |       40624 |     832.75 |  1.00

Scores
------
Failure rate:       3.96% (FAIL)
Score:             300.23

4xA100 SXM4 80Go limited to 40Go of VRAM

CUDA_VISIBLE_DEVICES=0,1,2,3 MILABENCH_SIZER_AUTO=True MILABENCH_SIZER_CAPACITY=40000Mo milabench run
 =================
 Benchmark results
 =================
                          fail n       perf   sem%   std% peak_memory          score weight
 bert-fp16                   0 4     147.52   0.2%   1.9%       41938     588.500016   0.00
 bert-fp32                   0 4      29.08   0.9%  10.3%       42138     116.083048   0.00
 bert-tf32                   0 4     117.82   0.1%   1.0%       42140     470.743584   0.00
 bert-tf32-fp16              0 4     147.67   0.2%   2.4%       41938     588.804052   3.00
 bf16                        0 4     293.92   0.3%   6.0%        5688    1181.627938   0.00
 convnext_large-fp16         0 4     269.92   2.9%  32.5%       42628    1085.129084   0.00
 convnext_large-fp32         0 4      50.31   0.7%   7.8%       42136     199.292499   0.00
 convnext_large-tf32         0 4     136.86   0.5%   5.0%       42138     549.100135   0.00
 convnext_large-tf32-fp16    0 4     266.48   3.1%  33.8%       42628    1071.146282   3.00
 davit_large                 0 4     300.29   0.5%   7.7%       41728    1203.538777   1.00
 davit_large-multi           0 1    1171.04   1.2%   9.3%       50030    1171.042025   5.00
 dlrm                        0 1  454625.69   2.1%  16.4%        7758  454625.687871   1.00
 focalnet                    0 4     391.81   0.3%   5.1%       41802    1569.986673   2.00
 fp16                        0 4     289.96   0.2%   3.9%        5688    1163.810339   0.00
 fp32                        0 4      19.14   0.0%   0.8%        6066      76.603551   0.00
 llama                       0 4     493.43   6.1%  78.2%       32326    1888.979344   1.00
 opt-1_3b                    0 1      14.52   0.1%   0.3%       45930      14.518303   5.00
 opt-6_7b                    0 1       5.96   0.0%   0.1%       75444       5.955118   5.00 ** High memory **
 reformer                    0 4      46.27   0.0%   0.3%       41986     185.104527   1.00
 regnet_y_128gf              0 4     105.08   0.7%  10.8%       42318     421.706539   2.00
 resnet152                   0 4     674.90   0.5%   7.3%       43688    2706.277411   1.00
 resnet152-multi             0 1    2350.25   2.2%  16.9%       52338    2350.245540   5.00
 resnet50                    0 4     420.09   5.8%  91.1%       42262    1653.944065   1.00
 rwkv                        4 4        NaN    NaN    NaN        5458            NaN   1.00
 stargan                     0 4      36.75   1.3%  20.5%       32310     147.651415   1.00
 super-slomo                 0 4      41.87   0.8%  12.0%       41986     167.928514   1.00
 t5                          0 4      49.55   0.3%   4.5%       41444     198.383370   2.00
 tf32                        0 4     146.74   0.2%   3.8%        6066     588.944520   0.00
 whisper                     0 4     209.19   0.7%  10.5%       42242     838.753126   1.00

 Scores
 ------
 Failure rate:       4.00% (FAIL)
 Score:             444.18

 Errors
 ------
 4 errors, details in HTML report.

Issues

> Traceback (most recent call last):
>   File "/gpfs/home3/pmorillas/mila/milabench/milabench/utils.py", line 69, in wrapped
>   return fn(*args, **kwargs)
>   File "/gpfs/home3/pmorillas/mila/milabench/milabench/summary.py", line 50, in aggregate
>   assert config and start and end
> AssertionError
> Source: mila_installation/runs/

This indicates that the configuration might be missing or invalid. It can happen when generating a report from an incomplete run as either the first metric entry (config) or the last config entry (end) might be missing. It can be the symptom of another problem that caused benchmarks to fail to run successfully.

>   File "/gpfs/home3/pmorillas/mila2/milabench/milabench/cli/run.py", line 82, in cli_run
>     arch = next(iter(mp.packs.values())).config["system"]["arch"]
>            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> StopIteration

This indicates no bench were found to run; either the configuration was invalid or the –select filtered out all benchmarks.