GPU Server Setup for ML: CUDA, PyTorch, TensorFlow

We configure compute environments for machine learning tasks: the environment for model training and inference runs predictably, without downtime or manual edits before each run. The result — time for preparation and restarting training is reduced severalfold, and the team focuses on models, not infrastructure. Let's discuss your task and come back with an estimate and plan.
Frequently Asked Questions

GPU Server Setup: Where the Training Environment Breaks

GPU server setup rarely breaks on hardware — more often at the junction of the driver, runtime, and the environment of a specific experiment.

The typical picture: training confidently gets through the first epochs, then fails midway — sometimes due to out-of-memory, sometimes due to runtime desynchronization, sometimes silently, leaving behind an incomplete checkpoint and lost hours of accelerator work.

Repeating the run with the same metrics is no longer possible: some steps were done in an interactive session, some by a script, and the sequence of actions cannot be reconstructed.

The second source of failures is a version conflict of libraries between environments.

The developer node, test server, and production environment were assembled at different times, packages were updated one by one, and the same code imports on one environment but fails even before startup on another.

This is discovered not during image build, but at the moment of starting a long training run, when the cost of an error is highest — hence the classic “it works on my machine.”

The queue of training jobs almost always lives in chat: several engineers share the same accelerators, manually agreeing who occupies the GPUs and when. Some sit idle waiting for release, short experiments do not get launched for weeks because longer ones crowd them out. There are no priorities, quotas, or predictable waiting time.

Finally, experiment reproducibility collapses without a fixed environment: a run is tied neither to an image version, nor to a data snapshot, nor to parameters committed in the repository.

A model training environment should come up from a description with a single command and produce the same result on any node — we look at how this is solved.

What a Consistent Environment Delivers: The Effect in Numbers

The difference between “it works on my machine” and “it works on the cluster” almost always comes down to the environment: driver version, library build, installation order.

Industry measurements from State of MLOps show that teams spend a noticeable share of engineering time sorting out such discrepancies, while accelerators sit idle waiting for a working build.

A Single Build Instead of Manual Edits

The environment is described declaratively: driver, library, and system dependency versions are pinned, and the build is reproduced with a single command. A new configuration is deployed in minutes instead of hours of manual installation.

Environment isolation makes it possible to keep several incompatible library sets on one server — they do not overwrite each other’s dependencies or break a neighboring experiment.

Which Classes of Failures Go Away

The first to go is the “driver fell off after reboot” class: the node comes up from the same image, and recovery time after a failure is measured in minutes rather than searching logs for the right version.

The second is discrepancies between nodes: accelerator utilization is predictable on all machines, so the share of failed training runs drops, and compute resource idle time is reduced to the time spent on the task itself.

Deployment Options for Compute Resources

The choice of option is dictated by the workload profile: job duration, number of teams on one piece of hardware, requirements for data isolation and library versions. Below are deployment options with honest limitations for each.

Option When it fits Limitations
Dedicated environment Constant utilization, sensitive data, fixed driver and library versions Downtime between projects and hardware upgrades are on your side
Container isolation Multiple teams or projects on one piece of hardware, reproducible environments Overhead for disk I/O, driver debugging is more complex
Shared training cluster Many short jobs, need queues, priorities, and quotas Neighbors affect startup time, heavy jobs need whole nodes
Renting capacity for peaks Periodic spikes: hyperparameter search, training a large model Different library versions — compatibility checks and state export are needed

When Container Isolation Is Excessive

If the environment is occupied by one team with one stack, there is nothing to separate: containers add a layer that complicates access to accelerators.

Public measurements of overhead show a discrepancy within a few percent in training — more noticeable is something else: debugging driver versions in the system environment is faster. Isolation is kept selectively, for experiments capable of bringing down the shared environment.

Hybrid: Your Own Environment and Rented Capacity for Peaks

The baseline workload stays on your own hardware, peaks go to rented capacity, and costs do not follow maximum consumption.

The scheme works with identical environment images and matching versions of acceleration libraries: intermediate training state is transferred between sites without a rebuild.

Implementation Stages: From Audit to Handover

The order of work is strict: each stage relies on the result of the previous one, and rearranging steps sets you back two stages. Below is what the path from audit to handover looks like.

  1. Environment audit. Inventory of servers, accelerators, drivers, access, network, and data storage. The output is a list of constraints that define the configuration.
  2. Infrastructure design. Node roles and environment isolation by project: updating a library in one project does not break other runs.
  3. Drivers and system layer. A unified state of drivers and a compatible CUDA branch, limits, caches, accelerator utilization monitoring.
  4. Machine learning library setup. PyTorch and TensorFlow as builds for the driver-accelerator combination; we check device visibility and environment reproducibility on a new machine.
  5. Validation on a real task. We run the customer’s model and data, not a synthetic test.
  6. Handover and team training. Walkthrough on the customer’s environment and a complete documentation set.

Validation on a Real Training Task

A synthetic test only confirms that devices are visible. We take the customer’s dataset and model and go through the full cycle: data preparation, training, saving, and reloading weights.

We measure epoch time and accelerator utilization — if the bottleneck is in data reading or code rather than hardware, it is visible here, not a month into operation.

Handover and Team Training

We hand over the infrastructure design, environment configurations, access policies, and procedures for typical operations: bring up a new node, update a library without risk to neighboring projects, roll back to the previous set.

The walkthrough takes place on your environment — engineers repeat the installation and launch themselves. There is one readiness criterion: the environment is reproduced without us.

Configurations, Designs, and Runbooks After Implementation

After GPU server setup, the team is left not only with a working environment but also with a set of artifacts by which it can be reproduced, expanded, and repaired without the author.

The check is simple: a new engineer brings up the environment from the documentation without asking questions in chat.

  • Environment configurations — drivers, CUDA branch, PyTorch and TensorFlow builds, and library versions are pinned so that the environment comes up again rather than being reconstructed from memory.
  • Designs and topology — where datasets and training artifacts are stored, how nodes connect to storage and the job queue, and which node handles inference.
  • Access policies — researcher, engineer, and service account roles: who has access to data, who can launch training, and who can edit node configurations.
  • Recovery runbook — the procedure for a node failure or process loss: where the latest checkpoint is and which replica the job moves to.
  • Monitoring — which node and accelerator utilization metrics are collected and at which thresholds an alert arrives before the job queue stalls.
  • Change log — what changed in the environment and when, to distinguish a failure after an update from hardware degradation.

Documentation and Failure Recovery Procedure

The runbook is step-by-step instructions: check node state, restart training from the latest checkpoint, roll the environment back to the previous pinned configuration.

We set the target recovery time in advance and validate it with a training failure — we shut down a node in the environment and see whether the team meets the deadline.

Without such a check, the document remains a declaration, and the first real accelerator failure turns into downtime lasting several days.

Case Study: Reduced Training Time and Eliminated Downtime

A team came to us that trained models on its own GPU server: drivers and libraries were installed manually directly on the host, and the configuration lived in engineers’ notes.

Experiments were launched, but reproducing someone else’s run a week later was no longer possible — versions diverged, and after a kernel crash the server sat idle.

Before

Building a working environment took almost a day of manual work and still produced discrepancies between machines. Four out of ten training runs failed at startup due to mismatched library and driver versions.

Accelerators sat idle: jobs waited in a shared queue, and engineers waited for the server to free up.

After

We moved the environment into containers with pinned dependencies, the configuration into a repository, and brought the drivers to the current NVIDIA branch. Before every run, the environment is checked; a failed job restarts from the latest checkpoint rather than from scratch.

Metric Before After
Environment build about a day manually 20 minutes from a ready image
Failed runs 4 out of 10 less than 1 out of 20
Recovery after failure half a day 15 minutes
Accelerator utilization idle between jobs most of the time
Run reproducibility discrepancies between machines identical result

Recovery time after a kernel failure dropped from half a day to 15 minutes, and the share of failed runs from 40% to single digits. Accelerators stopped sitting idle between experiments, and training is reproduced on any machine in the team.

How Does Preparing an Environment for Training Differ from Inference?

The requirements for an environment during training and model inference diverge so much that a single environment for both modes almost always turns out to be a compromise.

Training keeps weights, optimizer state, and current-step activations in memory — with a large batch size, consumption hits the ceiling, so resources are calculated by peak rather than average utilization.

The cost of an error is high: the cycle runs for hours, and losing a checkpoint resets the work to zero.

Inference is structured differently. Weights are fixed, memory for the model and request buffers is allocated once and does not change afterward. What matters is not peak compute but steady response time and the ability to sustain a stream of requests without tail latency drops.

That is why quantization, layer fusion, and builds for specific hardware are enabled here — a small loss in accuracy is paid back by predictable latency.

Accelerator operating modes dictate their own requirements. Training means long sessions at maximum compute block utilization: emphasis on cooling and stable power, because a frequency drop in the middle of a cycle breaks the schedule.

Inference means short bursts, where readiness to accept a request immediately and not waste time on switching matters more.

Resource separation follows directly from this. An accelerator for training is given to a single process without neighbors: memory eviction by another job kills the cycle.

For inference, the resource is shared — several model instances on one GPU with strict memory limits, priorities, and queue isolation.

Updates are different too: the training environment is restarted entirely, while weights under load are swapped by version so that rollback takes seconds.

Technical Doubts: Isolation, Compatibility, Rollback

Doubts about such an environment are usually the same: will teams interfere with each other, will the environment diverge after library updates, and can you roll back quickly? We look at how this is solved by configuration rather than by agreements.

How do teams avoid interfering with each other on one server?

Each team has its own isolated environment with a pinned set of dependencies, and access to accelerators is granted by the scheduler according to quotas.

Permissions are restricted, so only your own data and configs are visible: one experiment does not take all the resources or bring down other processes.

What should be done when libraries are incompatible?

Environments are built as immutable images with pinned versions. A project with an incompatible set is allocated a separate image, while the shared system layer is left untouched — updating one environment does not affect the others.

Can an update be rolled back?

Before a change, the previous image and configuration are saved, so reverting is a switch and restart in minutes, not a rebuild from scratch. Data and training results remain in place.

How is the resource shared between teams?

A queue with priorities, quotas for accelerator memory, and a limit on concurrent jobs. Heavy training waits its turn, short jobs go through immediately, and overall utilization is visible in monitoring.

How do you update drivers while jobs are running?

The driver lives on the host separately from environments. Updates follow a maintenance window: first the test node, then the rest, with the option to roll back. Jobs in the window are stopped with intermediate states saved.

GPU Server Setup for Your Models: Let’s Discuss the Task

GPU server setup begins not with installing drivers but with understanding the task: what makes sense to build at all depends on the model class, data volume, and workload profile.

To discuss the task concretely and come back with an estimate and work plan rather than generalities, we ask you to clarify a few things.

  • which models you train and fine-tune: your own architectures, fine-tuning open weights, or only inference of ready models;
  • data volumes and storage method — local array, network storage, object storage;
  • how many jobs run in parallel: single experiments or a queue from several engineers;
  • whether environment isolation is needed for different library versions and compatibility with the accelerator driver;
  • how access is organized: who logs in, with which keys, and whether a separate environment without a direct connection to the office network is required;
  • what is already available — current equipment, disks, network, room, power, and cooling;
  • what result you are aiming for: one node for a pilot or a configuration with headroom for growth.

In response, we send a configuration design with justification for the choice of accelerators and memory, a staged work plan with labor effort, and a list of risks.

We separately define acceptance criteria: what response time and utilization we consider normal, how we check environment reproducibility, and how we roll back to the previous state.

The first step of collaboration is a short discovery session: a 30–40 minute call or correspondence on the list above. After that, you receive an estimate and work plan and decide whether to launch the build.

Describe the task in free form: models, volumes, and what is already in place. We will come back with an estimate and plan.

AI Development Areas

Latest works

  • Development of a web application for FEEDME
    Development of a web application for FEEDME
    1393
  • Development of an online store for the company FURNORO
    Development of an online store for the company FURNORO
    1368
  • B2B Advance company logo design
    B2B Advance company logo design
    815
  • Development of a web application for Enviok
    Development of a web application for Enviok
    1139
  • AIDER company logo development
    AIDER company logo development
    1057
  • CRM development for Chasseurs
    CRM development for Chasseurs
    1152