Offline Calibration Webservice
The offline calibration webservice interacts with the Metadata Catalogue (MDC), such that migration of data to the offline cluster automatically triggers calibration jobs on relevant files.
Installation
Installation should only be performed by trained personal.
Prerequisites
The service needs to be installed under a functional user account which
- has read permission to the raw data folder on the Maxwell cluster
- has write permission to the proc folders for outputting corrected data
- is allowed to launch SLURM jobs on the cluster
The hosting system needs to be accessible via ZMQ calls from the MDC. This requires appropriate DMZ settings. Additionally, it needs to be able to interact with the MDC via the MDC client interface
Installation of Dependencies
The installation requirements can be found in the requirements.txt file. Additionally, the xfel-calibrate environment needs to be installed:
-
clone the pycalibration repo into a directory of your choice:
git clone https://git.xfel.eu/gitlab/detectors/pycalibration.git .
-
pick the python environment to install into. On Maxwell the anaconda/3 environment will work:
module load anaconda/3
-
install the xfel-calibrate environment
pip install --user -r requirements.txt
-
some correction notebooks require pyDetLib. It requires manual installation in a non-Karabo python environment
mkdir pydetlib cd pydetlib git clone https://git.xfel.eu/gitlab/karaboDevices/pyDetLib.git . pip install --user ./lib/requirements.txt pip install --user pycuda pip install --user ./lib/ cd ..
-
install the separate requirements for the webservice:
cd webservice pip install --user -r requirements.txt
-
install the metadata_client library, according to instructions at
You are now good to go.
Configuration
Configuration is done through the webservice.yaml file in the webservice directory. On a new installation you will likely need to change the following parameters.
In the config-repo section, the configuration repository needs to be configured:
config-repo:
url: https://git.xfel.eu/gitlab/detectors/calibration_configurations.git
local-path: /home/haufs/calibration_config/
Here you should prepend the url entry with a gitlab access token, that provides access to the calibration_configurations repository.
In the web-service section, the webservice itself is configured:
web-service:
port: 5555
bind-to: tcp://*
allowed-ips: '111.222.222.111', ''111.222.222.112'
job-db: ./webservice_jobs.sqlite
job-update-interval: 30
job-timeout: 3600
In case you want to use authentication, add a list of allowed-ips.
In the metadata-client section, the client interface to the MDC is configured:
metadata-client:
user-id:
user-secret:
user-email:
metadata-web-app-url: 'https://in.xfel.eu/metadata'
metadata-web-app-url: 'https://in.xfel.eu/metadata'
token-url: 'https://in.xfel.eu/metadata/oauth/token'
refresh-url: 'https://in.xfel.eu/metadata/oauth/token'
auth-url: 'https://in.xfel.eu/metadata/oauth/authorize'
scope: ''
base-api-url: 'https://in.xfel.eu/metadata/api/'
Here, user-ids, secrets, email etc as provided by ITDM need to be entered.
Finally, sections for the individual actions the service knows can be configured. Currently, the only action is correct:
correct:
in-folder: /gpfs/exfel/exp/{instrument}/{cycle}/p{proposal}/raw
out-folder: /gpfs/exfel/exp/{instrument}/{cycle}/p{proposal}/proc
It expects templates for the input and output file paths to be provided.
Starting the Service
The webservice can be started as a normal python process:
python webservice.py --mode [prod | prod-auth | sim]
The available modes are:
- prod: production mode
- prod-auth: production mode with authentication on ZMQ
- sim: simulation mode, no actual xfel-calibrate jobs are launched.
Use
python webservice.py --help
to display a list of available options.
Testing
There is a test environment on max-exfl-cal002
, separate from the production
instance.
ssh xcaltst@max-exfl-cal002.desy.de
cd /home/xcaltst/pycalibration
# Get the code you want to test
git pull
git checkout <branch-to-test>
# Stop the already running server, start a new one with your code
ps aux | grep webservice/webservice.py | awk '{ print $2}' | xargs kill
source ~/pycalibration_venv/bin/activate
nohup ~/pycalibration_venv/bin/python ~/pycalibration/webservice/webservice.py \
--mode prod --logging INFO --config-file ~/pycalibration/webservice/webservice.yaml &
# Follow the logs
tail -f ~/pycalibration/web.log
The test instance of myMdC talks to this test service. Using data in the CALLAB proposal there, request recalibration (runs tab) and processing of dark runs (calibration constants tab) to send the 'correct' and 'dark_request' actions. The webservice logs and the status in myMdC should update as the processing occurs.
The command squeue -u xcaltst
will show running & pending Slurm jobs started
by this test system.
Manually Submitting Jobs
A script manual_launch.py
is provided to manually submit jobs to the service.
usage: manual_launch.py [-h] --proposal PROPOSAL [--delay DELAY] [--noconfirm] [--really] slices [slices ...]
Manually submit calibration jobs.
positional arguments:
slices slices (or single numbers) of runs to process, inclusive range, starting at 1 (e.g. 1:3 parsed to {1, 2, 3}, 10 parsed to {10}, :10
parsed to {1, 2, ..., 10})
optional arguments:
-h, --help show this help message and exit
--proposal PROPOSAL proposal number
--delay DELAY delay in seconds between submissions
--noconfirm skip confirmation
--really actually submit jobs instead of just printing them
To run in the background use `nohup PYTHONUNBUFFERED=1 python manual_launch.py ... &` followed by `disown`.
Slices inclusive, so 1:10
would mean runs 1 to 10 inclusive of 1 and 10. The
'slice' can also be a single number.
Example of usage would be python3 ./manual_launch.py 1 10:12 160:-1 --delay 60 --proposal 2222 --really
to submit runs 1, 10 to 12, and 160+ for calibration,
for proposal 2222, with a 60 second delay between submissions.