Udhyam Labs AI
Limited-time deal8-GPU NVIDIA HGX B200 server in stock

Supermicro HGX B200, 8 GPUs

10U air-cooled · 8 × NVIDIA B200 180 GB · 2 × AMD EPYC 9575F · 2,304 GB DDR5 · 8 × 400G ConnectX-7 · 3-year warranty

A new engineering firm in Delhi, taking on work in India and abroad

We take on engineering work that has stalled, or that no single vendor is accountable for.

One team of senior engineers is accountable for the result in the scope you engage, and examines the layer above it and the layer below it. Every engagement starts with a fixed-fee assessment, and you can stop after it.

From a proof of concept to production

Our work is to take a proof of concept into production, and to show you in writing what is inside it

Many businesses are testing new technology, and most of that testing is in AI. A proof of concept, or a pilot, shows that the technology can do the job on a chosen sample. It has not yet been asked what production will ask.

Production asks whether the system is right on your real data, whether it holds at peak load and at what cost, who and what can reach it, what you can show an auditor, how it fails, and who owns it and runs it. In our view it is uncommon for one implementation partner to be set up to take a proof of concept through all of those and to put each answer in writing. Our engineers assemble and test the system themselves, component by component, so this last part of the work is the part we take on.

From a proof of concept to production six questions that production asks Proof of concept a small teamsample dataa few userswide permissionsnobody on call Accuracyon your real data Load and costat peak concurrency Securitywho can reach it Auditlogs and approvals Failureand recovery Ownershipwho owns and runs it Production run by your teamreal dataevery intended usernarrow permissionssomeone on call Udhyam: assess, build in milestones, hand over with the engineers named in your statement of work From a proof of concept to production Proof of concept a small teamsample dataa few userswide permissionsnobody on call Accuracyon your real data Load and costat peak concurrency Securitywho can reach it Auditlogs and approvals Failureand recovery Ownershipwho owns and runs it Production run by your teamreal dataevery intended usernarrow permissionssomeone on call Udhyam: assess, build in milestones, hand over with the engineers named in your statement of work

The drawing shows the six questions that stand between a proof of concept and a system in production.

A test against agreed targets

The proof of concept is measured for accuracy on cases drawn from your own work, and for response time and cost at the concurrency you expect at peak, against targets agreed before the test starts.

Each component described in writing

Before a component in the agreed scope carries production traffic, you are told in writing what it does, what it depends on, the ways we have found that it can fail, and which of those we tested.

The engineers who test it build it

If you ask us to do the build, the engineers who ran the test do it and hand the system to your team. If the lead has to change, you are told first. A support period follows the handover.

We do not audit or certify the systems we build, and we do not issue security or compliance certificates. The documents are written for your own security team and your auditors to examine.

How an engagement runs

There are four steps, and each is set out in full under Working with us.

Describe

You describe what you are trying to do and what has stopped it. An engineer replies with questions, a proposed call, or a statement that the work is outside what we do.

Assess

The assessment has a fixed fee and a fixed length. It runs under an NDA, reads your systems with read-only access that you grant, and ends with written findings that are yours. You can stop there.

Build

The build is set out in milestones, and each milestone has acceptance tests agreed in writing before work on it starts. It is done in your accounts and repositories by engineers engaged directly by Udhyam.

Hand over

Your engineers run the system, a release and a rollback, which is a return to the previous version, themselves while ours observe. A support period follows, and continued engineering is available on a retainer if you want it.

Read how we work in full

The five practices

You can engage one practice on its own. A layer is one level of the system, from the hardware up to the application. Whichever practice you engage, we also examine the layer above it and the layer below it, and we report what we find there.

Moving production from one cloud provider to another

Virtual machines and containers usually move with little change. Sign-in and permissions, network design, the provider's own database services, and the operating procedures written around one provider's behaviour have to be rebuilt. We move the estate, meaning everything you run on the provider, in waves. Each wave is a group of services small enough to be moved back within one maintenance window, and the wave plan states the point after which a service can no longer be moved back.

What the work is planned to deliver

  • The estate running on the target provider, with every wave verified
  • Infrastructure code for each environment covered, in your repository
  • The source estate decommissioned, with a reconciled final bill
The practice in full
Estate cutover, wave 3 of 4 rollback tested before each wave Sourcecurrent provider 10 of 20 services moved Targetnew provider 10 verified, 2 more in parallel wave 1wave 2wave 3, in flightwave 4, planned IdentityfederatedNetworktransit liveDatareplicatingComputewave 3 of 4

The drawing shows a move part way through: ten services verified on the new provider, two running on both, and eight still to move.

Rebuilding a system that has outgrown its original design

A system that was built correctly for one set of assumptions can stop coping when those assumptions change. We replace the parts that have to change, with the system designed to stay in service throughout. Traffic moves to a new path only after that path has matched the old one on the same live requests, within a tolerance agreed with you.

What the work is planned to deliver

  • New components carrying production traffic
  • Data migrated and verified as part of the project
  • The old path retired, once the new path has met the retirement test agreed in advance
The practice in full
Incremental replacement, traffic shifting designed to stay in service Legacy system Orders, extractedBilling, extractedCatalogueReporting Shared database requests Routingfacade 30% 70% Orders serviceown datastoreBilling serviceown datastoreCatalogue servicereplicating, backfilling Shadow comparison old and new paths answer the same live requests one mismatch, resolved before the next shift

The drawing shows requests divided between the old system and its replacements, with both answers compared before more traffic moves.

Making a release safe enough to do on any working day

A release pipeline, the automated path from a code change to production, can have every stage and still leave the team unwilling to release without a manual check, because no stage measures whether the release is safe. We build test environments from the same code and configuration as production, release gates that a new version must pass before more users receive it, and a rollback, which is a return to the previous version, that is rehearsed and timed.

What the work is planned to deliver

  • Infrastructure defined as code in each environment covered
  • Gradual release gated on error rate, response time and a business signal you choose
  • A rollback rehearsed in production, with its restore time recorded
The practice in full
One change, commit to production gated on measured signals CommitsignedBuildrepeatableTestrisk basedPreviewprod configCanary5% of trafficReleaseprogressive Canary analysis canary against the stable version, plus a business signal error ratewithin tolerance p99 latencywithin tolerance Every gated signal within tolerancepromote to 25%, then to all traffic Any gated signal outside toleranceroll back automatically, restore time recorded

The drawing follows one change from commit to release. It is held at five percent of traffic until its signals have been judged.

Taking an AI pilot into daily use

A model that answers well in a demonstration has not yet been asked to serve every user at once. Doing that at a response time, and at a cost for each request, that the business can accept is a separate engineering problem, and it is the one we work on.

What the work is planned to deliver

  • The service in production, available to the people it was built for
  • Evaluation cases drawn from your own work, which show whether its answers are right
  • A measured cost, in your currency, for each type of request
The practice in full
One request, admission to stream measured at each stage mixed context lengths Continuousbatching Acceleratorprefill, then decode KV cache streamed tokens Time to first token first token queueprefilldecode split by stage, not one total Tokens per second a distribution, not an average Cost per million tokens capacity power idle capacity you carry the unit suppliers price in

The drawing follows one request through the system and shows where the waiting time and the cost arise.

Sizing a GPU purchase, or checking a quotation before you sign it

We size from the work you intend to run, and not from a catalogue of parts. A GPU server, the kind of machine that runs AI models, has several limits: how fast it calculates, how fast it moves data through its memory, and how much memory it holds. We test which limit your work reaches first and specify the servers for that limit. No supplier pays us, so the recommendation can be to buy what was quoted, to buy less or more, to buy a different part, or to rent first.

What the work is planned to deliver

  • A written recommendation, with the arithmetic shown in your currency
  • The cost of owning the servers, in your own facility or colocated in another firm's data centre, and of renting, compared on one basis in your currency
  • A specification for the servers and their network, where you ask for one, with the power and cooling the data centre must supply
The practice in full
Buy, colocate or rent compared at your measured utilisation cost per million tokens rent colocate buy your measured utilisation rent colocate buy 20%sustained utilisation, to 100% Limits at low concurrency Compute3%Memory bandwidth94%Memory needed22% Sized as one decision AcceleratorHost designNetworkPower, cooling across NVIDIA and AMD Curves are illustrative. Measuring your workload gives the utilisation at which owning becomes cheaper than renting, and that decides whether to rent first or to buy from the start.

The chart shows what renting, colocating and buying cost at different levels of use. The three bars show which limit of the hardware the work reaches first.

Swipe sideways for the other four practices.

Where each practice works in the stack

No practice is confined to one layer. Each layer is either worked on or examined by at least two practices, so the five are run by one team that can see all of them.

does its work hereexamines and reports onHardwareand networkCloudor data centrePlatformand pipelineModeland servingApplicationand use case
AI hardware advisory
Cloud to cloud migration
Delivery engineering
Platform re-engineering
AI inference systems
Covered by one teamone in-house team, from the hardware to the application
Our engineers work in
PyTorchTensorFlowvLLMTensorRTTerraformPulumiKubernetesGitHub ActionsGitLab CIArgo RolloutsOpenTelemetryPrometheusAWSAzureGoogle CloudOpenStackOpenShiftNVIDIA CUDAAMD ROCm
Why it is built this way

One team accountable for every layer in scope

When each layer is contracted to a different vendor, a fault that spans two layers can be left without an owner. A slow response after a migration, for example, can sit across the network path, the way the application holds its database connections, and a difference between two database engines, and each vendor can show that its own layer is within specification.

We are accountable for the result in the scope you engage. We also examine the layer above and the layer below, report what we find there, and work alongside your own team and your existing suppliers.

How we engineer
Application and use caseretrieval, context pipeline, evaluation cases
Model and servingPyTorch, vLLM, TensorRT, batching, KV cache
a common contract boundary between two vendors
Platform and pipelineKubernetes, Terraform, CI and CD, observability
Cloud or data centreAWS, Azure, Google Cloud, sovereign, bare metal
Hardware and networkNVIDIA and AMD accelerators, host, network topology
Udhyam is accountable for every layer in scopeand examines the layer on either side

We measure before we design

Where a system is running, we measure where its time and memory go before proposing a design. Where nothing is running yet, we measure a representative workload on capacity rented in an account you control. Where there is nothing to run, we work from stated inputs and say how uncertain the result is.

Two engineers on every engagement

The engineer who scopes the work leads it. A second engineer follows the engagement from the first day and can take it over. If the lead has to change, you are told first.

Each design decision is recorded with its measurements

The volume of work handled, the response time and the cost are recorded for each design decision that affects them, and are handed over with the system.

What you are handed at the end

Working assets that belong to you

The assessment ends with written findings and a short paper for your management. A build is planned to end with the working system and the measurements behind it, and advisory work with the sizing model. From the first day of the build everything is saved in your own code repositories, and it is yours.

  • A management paper from the assessment: what we found, what we recommend, an estimate of what it would cost and what could go wrong
  • Infrastructure code for each environment covered
  • Evaluation cases built from your own data
  • Release gates tied to measured signals
  • A cost model with every assumption visible

The three files shown here are examples, for your engineers, of what is stored in your repository.

# One wave of a cutover, for stateless services. Each name has a source
# record and a target record, and DNS answers divide in proportion to their
# weights. A target weight of zero stops new resolutions reaching the target.
# Cached answers and open connections drain over the TTL and the connection
# lifetime. Stateful services follow a separate replication plan.
variable "wave" {
  type = object({
    name          = string
    services      = set(string)
    target_weight = number # 0 to 100
  })
  validation {
    condition     = var.wave.target_weight >= 0 && var.wave.target_weight <= 100
    error_message = "The target weight must be between 0 and 100."
  }
}

resource "aws_route53_record" "target" {
  for_each       = var.wave.services
  zone_id        = var.zone_id
  name           = "${each.key}.${var.domain}"
  type           = "CNAME"
  ttl            = 60
  set_identifier = "target"
  records        = [local.target_endpoint[each.key]]

  weighted_routing_policy {
    weight = var.wave.target_weight
  }
}

resource "aws_route53_record" "source" {
  for_each       = var.wave.services
  zone_id        = var.zone_id
  name           = "${each.key}.${var.domain}"
  type           = "CNAME"
  ttl            = 60
  set_identifier = "source"
  records        = [local.source_endpoint[each.key]]

  weighted_routing_policy {
    weight = 100 - var.wave.target_weight
  }
}
# The same cases for every candidate model, replayed at your peak arrival rate.
def evaluate(model: Endpoint, cases: list[Case], requests_per_s: float) -> Result:
    runs = replay(model, cases, rate=requests_per_s)    # open loop, so queueing shows
    ok = [r for r in runs if r.ok]
    # A failed run scores zero and counts as a full timeout, so failing is never free.
    ttft = [r.ttft_ms if r.ok else TIMEOUT_MS for r in runs]
    # decode_s runs from the first token to the last, so it covers n - 1 tokens.
    rates = [(r.output_tokens - 1) / r.decode_s for r in ok if r.output_tokens > 1]

    return Result(
        model=model.name,
        accuracy=mean(r.case.grade(r.text) if r.ok else 0.0 for r in runs),
        failed_share=1 - len(ok) / len(runs),
        first_token_ms_p95=percentile(ttft, 95),
        tokens_per_s_p50=percentile(rates, 50),
        tokens_per_s_p05=percentile(rates, 5),          # the slowest requests
        # capacity cost at the utilisation you expect over a day, or the supplier's
        # input and output prices at the measured mix where the model is an API
        cost_per_m_tokens=model.cost_per_m_tokens(ok, utilisation=EXPECTED),
    )
# The canary advances when its signals have been judged against the stable
# version. Signals that arrive late are checked during a hold at 25 percent.
apiVersion: argoproj.io/v1alpha1
kind: Rollout
spec:
  rollbackWindow:
    revisions: 1  # re-applying the previous revision skips the steps
  strategy:
    canary:
      canaryService: app-canary
      stableService: app-stable
      trafficRouting:
        plugins:
          argoproj-labs/gatewayAPI:
            httpRoute: app  # the Gateway API route that carries the split
      steps:
        - setWeight: 5
        - analysis: &gate  # compares canary pods with stable pods
            templates:
              - templateName: error-rate-p99-and-approval-rate
            args:
              - name: canary-hash
                valueFrom: { podTemplateHashValue: Latest }
              - name: stable-hash
                valueFrom: { podTemplateHashValue: Stable }
        - setWeight: 25
        - analysis: *gate
        - pause: { duration: 30m }  # the hold for signals that arrive late
        - analysis: { templates: [{ templateName: reconciliation-breaks }] }
        - setWeight: 100
      scaleDownDelaySeconds: 600  # previous version stays up for ten minutes
These are simplified samples of three files: one migration wave, one evaluation run and one gradual release. The files for an engagement are written for that engagement.

Where the work is done from

The firm is based in Delhi and the engineering is led from India. Our engineers work from India and from other countries, and each engineer's profile states the country that engineer works from.

For organisations in India

If your data must stay in India, or the system must run on an Indian sovereign cloud or a private cloud, we design for that from the first conversation. We work inside your own accounts under named identities that you issue and can revoke. Tell us if your rules require the engineers to be in India, and the proposal will name engineers who are.

For organisations elsewhere

The terms are the same as for an organisation in India. We work inside your own accounts under named identities that you issue and can revoke. Tell us what your vendor onboarding requires, and we will answer it in writing.

Across time zones

We work in writing by default, so progress can be followed without a call. Each decision is recorded in your repository when it is made, and each switch from the old system to the new one is staffed live inside your maintenance window.

Describe the problem, and an engineer will reply within one working day

Tell us in general terms what you are trying to do and what has stopped it. If it is not ours to take on, we will say so.

Start a conversation An NDA, yours or ours, is signed before you share any detail of your systems.