Buildtest Tutorial on Perlmutter =================================== This tutorial will be conducted on the `Perlmutter `_ system. If you need account access please `obtain a user account `_. Setup ------ Once you have a NERSC account, you can `connect to any NERSC system `_. terminal client and ssh into perlmutter as follows:: ssh @perlmutter-p1.nersc.gov To get started please load the **python** module since you will need python 3.8 or higher to use buildtest. This can be done by running:: module load python Next, you should :ref:`Install buildtest ` by cloning the repository into your HOME directory:: git clone https://github.com/buildtesters/buildtest.git $HOME/buildtest .. note:: Please make sure you create a python virtual environment before you proceed with this tutorial. Once you have buildtest setup, please clone the following repository into your home directory:: git clone https://github.com/buildtesters/buildtest-nersc $HOME/buildtest-nersc You will need to set the environment variable `BUILDTEST_CONFIGFILE` which will point to the configuration file required to use buildtest on Perlmutter. .. code-block:: console export BUILDTEST_CONFIGFILE=$HOME/buildtest-nersc/config.yml Once you are done, please navigate back to the root of buildtest by running:: cd $BUILDTEST_ROOT The exercise can be found in directory `buildtest/perlmutter_tutorial `_ where you will have several exercises to complete. You can navigate to this directory by running:: cd $BUILDTEST_ROOT/perlmutter_tutorial **If you get stuck on any exercise, you can see the solution to each exercise in file ".solution.txt"** .. note:: For exercise 2 and 3, you can check the solution by running the shell script ``bash .solution.sh`` Exercise 1: Performing Status Check ------------------------------------- In this exercise, you will check the version of Lmod using the environment variable **LMOD_VERSION** and specify the the output using a :ref:`regular expression `. We will run the test with an invalid regular expression and see if test **FAIL** and rerun test until it **PASS**. Shown below is the example buildspec and please fix the highlighting lines in the test .. literalinclude:: ../perlmutter_tutorial/ex1/module_version.yml :language: yaml :emphasize-lines: 3-4 .. todo:: - Run the test by running ``buildtest build -b $BUILDTEST_ROOT/perlmutter_tutorial/ex1/module_version.yml`` and you will notice failure in validation - Validate the buildspec using ``buildtest buildspec validate`` to determine the error - Fix the buildspec and rerun ``buildtest buildspec validate`` until we have a valid buildspec. - Add a regular expression on ``stdout`` stream and make sure test fails - Check output of test via ``buildtest inspect query`` - Update regular expression to match output with value of **$LMOD_VERSION** reported in test and rerun test until it passes. Exercise 2: Querying Buildspec Cache ------------------------------------- In this exercise you will learn how to use the :ref:`buildspec_interface`. Let's build the cache by running the following:: buildtest buildspec find --directory $HOME/buildtest-nersc/buildspecs --rebuild -q .. todo:: 1. Find all tags 2. List all filters and format fields 3. Format tables via fields ``name``, ``description`` 4. Filter buildspecs by tag ``e4s`` 5. List all invalid buildspecs 6. Validate all buildspecs by tag ``e4s`` 7. Show content of test ``hello_world_openmp`` Exercise 3: Query Test Report ------------------------------- In this exercise you will learn how to :ref:`query test report `. This can be done by running ``buildtest report``. Before you start, please run the following command:: buildtest bd -b $HOME/buildtest-nersc/buildspecs/apps/spack/ .. todo:: 1. List all filters and format fields 2. Query all tests by returncode 0 3. Query all tests by tag ``e4s`` 4. Print the total count of all failed tests Let's upload the tests to CDASH by running the following:: buildtest cdash upload $USER-buildtest-tutorial Buildtest :ref:`cdash integration ` via ``buildtest cdash upload`` allows buildtest to push test results to CDASH server. The test results are captured in report file typically shown via ``buildtest report``. CDASH allows one to easily process the test results in web-interface. If you were successful in running above command, you should see a link to CDASH server https://my.cdash.org with link to test results, please click on the link to view your test results and briefly analyze the test results. Shown below is an example output .. code-block:: console  buildtest cdash upload $USER-buildtest-tutorial Reading report file: /Users/siddiq90/Documents/github/buildtest/var/report.json Uploading 110 tests Build Name: siddiq90-buildtest-tutorial site: generic MD5SUM: a589c72bcdabdab9038600a2789e429f You can view the results at: https://my.cdash.org//viewTest.php?buildid=2278337 Exercise 4: Specifying Performance Checks -------------------------------------------- In this exercise, you will be running the `STREAM benchmark `_ and use :ref:`comparison operators ` to determine if test will pass based on the performance results. Shown below is the stream test that we will be using for this exercise .. literalinclude:: ../perlmutter_tutorial/ex4/stream.yml :language: yaml .. todo:: - Run the stream test by running ``buildtest build -b $BUILDTEST_ROOT/perlmutter_tutorial/ex4/stream.yml`` - Check the output of metrics ``copy`` and ``scale`` by running **buildtest inspect query -o stream_test** - Use the :ref:`assert_ge` check with metric ``copy`` and ``scale``. Specify a reference value `50000` for metric **copy** and **scale*** - Run the same test and examine output - Next try different reference value such as ``5000`` and rerun test and see output Exercise 5: Running a Batch Job -------------------------------- In this exercise, you will submit a batch job that will run ``hostname`` in the slurm cluster. Shown below is the example buildspec .. literalinclude:: ../perlmutter_tutorial/ex5/hostname.yml :language: yaml :emphasize-lines: 5,7,8 Take note that the test will run on executor ``perlmutter.slurm.debug`` which corresponds to the slurm ``debug`` queue on Perlmutter. The ``sbatch`` options specify the :ref:`batch directives ` for running the job. In this exercise you are requested to do the following: .. todo:: - Run the test with poll interval for 10 sec ``$BUILDTEST_ROOT/perlmutter_tutorial/ex5/hostname.yml`` and take note of output, you should see job is submitted to batch scheduler. Refer to ``buildtest build --help`` for list of complete options - Check the output of test via ``buildtest inspect query`` - Update the test to make use of :ref:`Multiple Executors ` and run test on both **regular** and **debug** queue and rerun the test. - Rerun same test and you should see two test runs for **hostname_perlmutter** one for each executor. If you have completed this exercise, you should expect the following output from ``buildtest build``. .. code-block:: console Test Summary ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━┓ ┃ builder ┃ executor ┃ status ┃ checks (ReturnCode, Regex, Runtime) ┃ returncode ┃ runtime ┃ ┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━┩ │ hostname_perlmutter/80e317c1 │ perlmutter.slurm.regular │ PASS │ N/A N/A N/A │ 0 │ 45.324512│ ├───────────────────────────────────────┼─────────────────────────────┼────────┼─────────────────────────────────────┼────────────┼──────────┤ │ hostname_perlmutter/b1d7b318 │ perlmutter.slurm.debug │ PASS │ N/A N/A N/A │ 0 │ 75.54278 │ └───────────────────────────────────────┴─────────────────────────────┴────────┴─────────────────────────────────────┴────────────┴──────────┘