Installation Guide
Copyright © 2026 by Symetry, Inc. 14 Pine Street, Ste 6 Morristown, NJ 07960 All Rights Reserved
Introduction
SymetryML is delivered as a Docker image with all dependencies pre-configured, including the application server, Redis, native math libraries, and Spark support. This guide describes how to install, update, and configure SymetryML. For additional information, refer to the following documents:
Prerequisites
Before installing SymetryML, ensure the following are in place:
- Docker Engine installed on the host machine.
- SymetryML license file (
sym.lic) provided by Symetry. - (Optional) NVIDIA Container Toolkit if using GPU or Multi-GPU projects — see the GPU Installation Guide.
- (Optional) External Spark 4.1.0 cluster — see the Spark Installation Guide.
Pulling the Docker Image
SymetryML is hosted on Amazon ECR. To pull the image, first authenticate with the registry, then pull.
Step 1 — Authenticate with ECR
SymetryML will provide you with a 12 hours valid token that you can assign to an environment variable (ZTOKEN) and then login to the SymetryML Elastic Container Registry (ECR) with the following command:
docker login -u AWS -p $ZTOKEN 428117700962.dkr.ecr.us-east-1.amazonaws.comStep 2 — Pull the image
docker pull 428117700962.dkr.ecr.us-east-1.amazonaws.com/sml-server:6.3.0Running SymetryML
The recommended way to run SymetryML is with Docker Compose. Create a docker-compose.yml file:
services:
sml-server:
image: 428117700962.dkr.ecr.us-east-1.amazonaws.com/sml-server:6.3.0
container_name: sml-server
ports:
- "8080:8080"
- "8443:8443"
volumes:
- ./sym.lic:/opt/symetry/sym.lic:ro
environment:
- JAVA_OPTS=-server -Xms4096m -Xmx8192m -Dfile.encoding=UTF-8
- SML_RTLM_DB_REDIS_HOST=localhost
- SML_RTLM_DB_REDIS_PORT=6379
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080"]
interval: 30s
timeout: 10s
retries: 3
restart: unless-stoppedStart SymetryML:
docker compose up -dPorts
| Port | Protocol | Description |
|---|---|---|
| 8080 | HTTP | Web UI and REST API |
| 8443 | HTTPS | Secure access |
GPU Support
To enable GPU acceleration, add the NVIDIA runtime and GPU environment variables:
services:
sml-server:
image: 428117700962.dkr.ecr.us-east-1.amazonaws.com/sml-server:6.3.0
container_name: sml-server
runtime: nvidia
ports:
- "8080:8080"
- "8443:8443"
volumes:
- ./sym.lic:/opt/symetry/sym.lic:ro
environment:
- JAVA_OPTS=-server -Xms4096m -Xmx8192m -Dfile.encoding=UTF-8
- NVIDIA_VISIBLE_DEVICES=all
- LD_LIBRARY_PATH=/usr/local/cuda/lib64:/opt/symetry/nativelib
- SML_RTLM_DB_REDIS_HOST=localhost
- SML_RTLM_DB_REDIS_PORT=6379
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080"]
interval: 30s
timeout: 10s
retries: 3
restart: unless-stoppedSee the GPU Installation Guide for additional details.
Redis
Redis is bundled inside the Docker image and starts automatically. To use an external Redis instance instead, update the SML_RTLM_DB_REDIS_HOST and SML_RTLM_DB_REDIS_PORT environment variables to point to your external Redis server.
Configuration
Customizing Configuration Files
SymetryML uses two configuration files that control REST API and Web UI behavior:
symetry-rest.txt— REST API configuration (see SymetryML REST Configuration)symetry-web.txt— Web UI configuration (see SymetryML Web Configurations)
To override the default configuration, mount custom files into the container:
volumes:
- ./sym.lic:/opt/symetry/sym.lic:ro
- ./symetry-rest.txt:/opt/symetry/symetry-rest.txt:ro
- ./symetry-web.txt:/opt/symetry/symetry-web.txt:roSymetryML Memory Requirements
Please consult the SymetryML Technical Requirements for more information on memory requirements for various project sizes. Note that with SymetryML, project sizes are limited by the number of attributes, not the number of rows.
Memory is configured via the JAVA_OPTS environment variable. Adjust -Xms (minimum heap) and -Xmx (maximum heap) according to your project size:
environment:
- JAVA_OPTS=-server -Xms4096m -Xmx8192m -Dfile.encoding=UTF-8SymetryML REST Configuration
SymetryML REST behavior is controlled by the symetry-rest.txt configuration file. The following table provides information about available parameters.
| Parameter | Description |
|---|---|
jobreaper.run.period | Controls how often the 'thread reaper' runs. The thread reaper removes finished jobs from the job queue. Normally, a job is removed after a REST call is made to inquire about a job's status. If this call never comes, the job reaper ensures that the queue does not grow too large. |
jobreaper.job.expiration | Expiration time for a job to be removed from the list of jobs after it is finished. That is removed by the JobReaper mentioned above. |
request.body.max.size | Maximum number of bytes accepted from a REST request body; a larger body is rejected with 413 Payload Too Large. A value of 0 or less disables the limit. Default: 268435456 (256 MB). See Request Body Size Limit. |
request.signature.timeout | Reserved for internal use. |
rtlm.option.assessment.limit.size | The maximum number of lines to read from a datasource during a model assessment. Default: 1000000 |
rtlm.option.azure.blob.inputstream.chunk.size.max.bytes | When using Azure Blob storage datasource, this is the chuck size used when downloading the files. Default is 4194304. |
rtlm.option.job.scheduler.fixed.thread.max.pool.size | Number of jobs that can run in parallel. Setting this number too high might cause contention problems on the computer running SymetryML and might cause Jetty to become unresponsive. Recommended values: 1 or 2. |
rtlm.option.rtlm.core.max | Maximum number of CPU cores to use when updating a Symetry Project with data. This number cannot be higher than the number authorized in your SymetryML license. |
rtlm.option.rtlm.db.redis | Specifies whether to use redis. 0 = disables persistence altogether. |
rtlm.option.rtlm.db.redis.host | Hostname of the redis server. Normally, this is localhost and was never tested otherwise. |
rtlm.option.rtlm.db.redis.master.name | Reserved for internal use. |
rtlm.option.rtlm.db.redis.port | Redis port (default: 6379). |
rtlm.option.rtlm.db.redis.sentinel | Reserved for internal use. |
rtlm.option.rtlm.db.redis.sentinel.host | Reserved for internal use. |
rtlm.option.rtlm.db.redis.sentinel.port | Reserved for internal use. |
rtlm.option.rtlm.gpu.matrix.minsize | Minimum matrix size to use GPU. Matrix is used when SymetryML builds models. |
rtlm.option.rtlm.gpu.update.minsize | Minimum size to use GPU to update SymetryML project. |
rtlm.option.rtlm.mgpu.runon.one | Enabling that specifies that a MultiGPU project can run on a server with only 1 GPU. '1' enables and '0' disables. Default: '0' |
rtlm.option.rtlm.mgpu.num.gpus | The maximum number of GPUs that can be used on a server in a MultiGPU project. |
rtlm.option.rtlm.model.mc.maxinfo | Maximum target count or transition size in a Markov Chain or Hidden Markov Model. Default: 512 |
rtlm.option.sml.autoselect.num.threads | The number of worker threads to use during Auto Select. Default: 8 |
rtlm.option.sml.batch.predict.limit.size | The maximum number of lines that can be read in a batch prediction. Default: 1000000 |
rtlm.option.sml.date.server.timeout | The maximum time in ms allowed for fetching the current time from the date server during licence verification. Default: 10000 |
rtlm.option.sml.default.rcond.threshold | The reciprocal condition number tolerance in matrix inverse operations. Default: 1e-14 |
rtlm.option.sml.density.num.threads | Control the number of threads that perform density computation |
rtlm.option.sml.disable_bet.update | Enabling for the disabling of updates to the BET. '1' enables and '0' disables. Default: '0' |
rtlm.option.sml.fed.admin.token.default.timeout.hours | The default number of hours that federation token are valid, that is the number of hours that a user has to join a federation once the admin generate their encrypted federation information. Default is 2 hours |
rtlm.option.sml.fed.admin.trust_all_certs | Deprecated alias of rtlm.option.sml.tls.trust_all. Either key set to 1 turns certificate and host-key verification off. |
rtlm.option.sml.fed.strict.mode | Enabling for strict mode, which prevents Federated projects from using a Random Forest or Kaplan Meier model. '1' enables and '0' disables. Default: '0' |
rtlm.option.sml.fed.thread.pool.size | internal |
rtlm.option.sml.fusion.prefetch.min.time.ms | Minimum time to wait between Fusion cells prefetch. |
rtlm.option.sml.jdbc.drivers | Databases a jdbc data source may connect to: a comma-separated list of prefix|driver class pairs. Any other pair is refused; an empty value refuses every JDBC data source; there is no wildcard. The driver jar must be on the server classpath. Default: jdbc:mysql|com.mysql.cj.jdbc.Driver,jdbc:mysql|com.mysql.jdbc.Driver,jdbc:postgresql|org.postgresql.Driver. |
rtlm.option.sml.local_ds.enable | 1 enables local-file (localfile) data sources, which read, write and browse the server's own file system as the user running Jetty. Default: 0 (refused with 400). Enable only on a server where every user may read that file system. |
rtlm.option.sml.matrix.allow.non.native | 1 to allow. 0 to block. Default is 0. This control whether or not SymetryML will allow the software to run without the optimized 'native' library. By default if SymetryML cannot load those native libraries it won't be able to build models. |
rtlm.option.sml.mgpubet.persistence.dir | The directory to store the persisted MultiGPU project file into. Default: '/tmp' |
rtlm.option.sml.mgpubet.persistence.suffix | The suffix to identify the persisted MultiGPU project file. Default: '-BET' |
rtlm.option.sml.mgpubet.persistence.file-ext | The file extension of the persisted MultiGPU project file. Default: '.bet.gz' |
rtlm.option.sml.nan.values | Comma-separated list of additional tokens to treat as missing values when parsing continuous columns, on top of the built-in set (null, nil, <null>, nan, inf, -inf, infinity, -infinity, -). Matched case-insensitively. Default: - |
rtlm.option.sml.nats.plaintext_credentials.allow | Whether a NATS token or password may be sent over plain nats:// (no TLS). 1 (default) allows it and logs a warning; 0 refuses it. Credentials written inside a server URL count too. |
rtlm.option.sml.power.prefix | Default is pt_ |
rtlm.option.sml.power.separator | Default is ^ |
rtlm.option.sml.redshift.url_options | Option names a Redshift data source URL may carry after the database (?name=value), comma-separated. Any other option is refused; an empty value accepts none. Default: tcpKeepAlive. |
rtlm.option.sml.sftp.known_hosts | Optional known_hosts file for SFTP data sources (fill it with ssh-keyscan). Default: the known_hosts of the user running Jetty. An SFTP host whose key is not listed is refused unless sml.tls.trust_all=1. |
rtlm.option.sml.spark.core.max | Maximum number of CPU cores to use in a job on a Spark cluster. |
rtlm.option.sml.spark.so.send | Spark Cluster driver socket configuration. For details, refer to the linux socket documentation. |
rtlm.option.sml.spark.so.rcv | Spark Cluster driver socket configuration. For details, refer to the linux socket documentation. |
rtlm.option.sml.streams.error_on_df_change | Whether or not to throw an error when the schema of stream change as new data arrive. Default is 0 for false. |
rtlm.option.sml.streams.processor.num.threads | Number of threads to use to process SML Streams. Default is 4. |
rtlm.option.sml.streams.processor.sleep.time.ms.empty | Time in millisecs to sleep when there are no activity on a Stream Processor. Default is 5000, (5 secs). |
rtlm.option.sml.streams.processor.sleep.time.ms.with_record | Time in millisecs to sleep when there are activity on a Stream Processor. Default is 0 millisecs. |
rtlm.option.sml.tdigest.compression | Compression factor of the t-digest used for histogram and quantile estimation. Higher values give more accurate quantiles at the cost of memory. Default: 250 |
rtlm.option.sml.tls.trust_all | 0 (default): the TLS certificates of federation and fusion peers, HTTPS data sources and tls:// NATS servers are verified against the platform trust store (plus sml.tls.truststore) with hostname verification, and SFTP host keys must be in known_hosts. 1: any certificate and host key is accepted, as before 7.0, and a warning is logged at startup. Use 1 on test systems only. |
rtlm.option.sml.tls.truststore | Optional JKS or PKCS12 file with the CA or server certificates of peers and HTTPS or NATS sources signed by a private CA. The platform trust store still applies. A missing file is reported as an error naming this key. |
rtlm.option.sml.tls.truststore.password | Password of sml.tls.truststore. Masked in logs. |
rtlm.option.sml.user.projects.max | Maximum number of project allowed |
rtlm.option.sml.user.datasources.load.max | Maximum number of data sources, default is 1000. |
rtlm.option.snowflake.job.role | Snowflake role used when processing a job. In 6.4 this moved here from the data source info map. |
rtlm.option.spark.4.1.0.azb.extra.app.jars.dir | Extra application jars for Microsoft Azure Blob Spark jobs. Default: /opt/symetry/spark-support/spark4.1.0/azb-extra-app-jars |
rtlm.option.spark.4.1.0.gcs.extra.app.jars.dir | Extra application jars for Google Cloud Storage Spark jobs. Default: /opt/symetry/spark-support/spark4.1.0/gcs-extra-app-jars |
rtlm.option.spark.4.1.0.installation.jars.dir | Directory holding the Spark 4.1.0 jars. Default: /opt/symetry/spark-support/spark4.1.0/jars |
rtlm.option.spark.4.1.0.s3.extra.app.jars.dir | Extra application jars for Amazon S3 Spark jobs. Default: /opt/symetry/spark-support/spark4.1.0/s3-extra-app-jars |
rtlm.option.spark.4.1.0.s3oci.extra.app.jars.dir | Extra application jars for Oracle OCI Object Storage Spark jobs. Default: /opt/symetry/spark-support/spark4.1.0/s3oci-extra-app-jars |
rtlm.option.spark.4.1.0.symetry.lib.ext.dir | Directory holding the SymetryML extension libraries used by Spark jobs. Default: /opt/symetry/libExt |
rtlm.option.spark.4.1.0.symetry.lib.ext.jars | Explicit list of SymetryML extension jars to ship with a Spark job. No default. |
rtlm.option.spark.automl.sample.random.seed | Seed for AutoML with Spark. Used for seeding the randomizer used to sample the data used for the autom warmup dataset. Default is 42. |
rtlm.option.spark.job.process.jvm.heap.size.max | Maximum heap of the Spark job process. Default is 32g. Format: 1 to 6 digits followed by k, m or g (for example 4096m); any other value fails the job with Invalid JVM heap size. A data source can override it with the same key. |
rtlm.option.spark.job.process.jvm.heap.size.min | Initial heap of the Spark job process. Default is 4096m. Format: 1 to 6 digits followed by k, m or g (for example 4096m); any other value fails the job with Invalid JVM heap size. A data source can override it with the same key. |
rtlm.option.spark.listener.host | IP address to use when the Spark Cluster sends results. |
rtlm.option.vfs.http.connection.timeout | HTTP connection timeout in ms for HTTP datasources. Default: 30000 |
rtlm.option.vfs.http.so.timeout | HTTP socket timeout in ms for HTTP datasources. Default: 30000 |
Cross-Origin Resource Sharing (CORS)
The REST API sends no CORS headers by default. To allow browser pages served from another origin to call the API, add -Dsml.rest.cors=true to JAVA_OPTS:
- JAVA_OPTS=-server -Xms4096m -Xmx8192m -Dfile.encoding=UTF-8 -Dsml.rest.cors=trueWhen the flag is active, the server logs CORS enabled for REST responses (-Dsml.rest.cors=true) at startup. For the headers this adds and the security implications, see Cross-Origin Resource Sharing (CORS).
SymetryML Web Configurations
Certain SymetryML Web parameters can be configured by editing the symetry-web.txt configuration file.
| Parameter | Description |
|---|---|
sym.web.legal.notice | Set to false to hide the legal notice during login |
sym.web.auto.logoff.enable | Set to false disable auto logoff |
sym.web.auto.logoff.time | Auto logoff time in minutes |
Updating SymetryML
To update SymetryML, pull the new image version and recreate the container:
docker pull 428117700962.dkr.ecr.us-east-1.amazonaws.com/sml-server:<NEW_VERSION>Update the image tag in your docker-compose.yml, then restart:
docker compose down
docker compose up -dUpgrading from 6.x to 7.0
SymetryML 7.0 changes how requests are signed and how credentials are encrypted, and it does not accept 6.x clients or 6.x encrypted data. Plan the upgrade as follows.
- Snapshot Redis before starting the 7.0 server.
- Have the stored credentials migrated. Customer credentials and data source definitions are stored encrypted in Redis in the pre-7.0 format and must be re-encrypted in the 7.0 format before the server can use them. Contact SymetryML support to plan this migration before upgrading an existing installation. Until it is done, the 7.0 server answers every request with
503 Service Unavailable. A new installation with an empty Redis needs no migration. - Upgrade every client together with the server: pymetry, the SymetryML web UI, the Java client, symetry-mcp and any custom client. A 6.x client is refused with
400because it sends nosym-version: 7.xheader, and its signatures and encrypted bodies are in the old format. See Protocol Version Header. - Upgrade every federation member. Every node of a federation or fusion must run 7.0.
- Review TLS and SFTP trust. Certificates of federation and fusion peers, HTTPS data sources and
tls://NATS servers are now verified, and SFTP host keys must be inknown_hosts. Provide a truststore and aknown_hostsfile where needed (rtlm.option.sml.tls.truststore,rtlm.option.sml.sftp.known_hosts). - Re-enable local-file data sources if you use them: they are off by default (
rtlm.option.sml.local_ds.enable=1).
Features removed in 7.0 (single sign-on, the Tasks API, third-party XGBoost models, EMR and Dataproc data sources) are listed in the Release Notes.
Troubleshooting
Question: I am getting the following error: java.util.concurrent.ExecutionException: javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
Answer: The remote host (a federation or fusion peer, an HTTPS data source or a tls:// NATS server) presents a certificate that the server does not trust. Since 7.0 certificates are verified by default. If the certificate is signed by a private CA, add that CA to a truststore and set rtlm.option.sml.tls.truststore (and rtlm.option.sml.tls.truststore.password). On a test system only, rtlm.option.sml.tls.trust_all=1 turns verification off. See the SymetryML REST Configuration section for details.