Open-source project
google/vizier avatar
google/vizier

google/vizier: a client-server service for black-box optimization

Python-based research interface for blackbox and hyperparameter optimization, based on the internal Google Vizier Service.

1,673 stars112 forksPythonApache-2.0

At a glance

What is it?
OSS Vizier packages Google's internal hyperparameter tuning service as a Python client-server system with three APIs. It is strongest when you need distributed suggestion generation and algorithm research, and weakest when a single-process optimizer would do.
Who is it for?
Adopt OSS Vizier if you need a persistent, multi-client optimization service, or if you are implementing and benchmarking new black-box algorithms against a shared interface. Do not adopt it for a one-off tuning run inside a single script; a plain optimizer call is less machinery.
Can I use it commercially?
Yes. Apache-2.0 is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 1 day ago.
What is it written in?
Mainly Python, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 15, 2026, and from our analysis. They are not legal advice.

DEEP OPEN-SOURCE ANALYSIS

The problem OSS Vizier addresses: many clients, one optimization state

Most hyperparameter tuning libraries assume one process owns the search. A loop proposes a configuration, evaluates it, records the result, and repeats. That model breaks when the evaluations are expensive and parallel, or when several people and several machines want to draw suggestions from the same study. OSS Vizier is built around the second model. The README describes it as a Python-based service for black-box optimization, based on Google Vizier, and the repository's own framing is a distributed client-server system. The unit of coordination is a study: a search space, a set of metrics, and an algorithm, held by a service that hands out suggestions on request. The intended audience is therefore split. One group is practitioners with a tuning problem whose evaluations are costly enough that parallel workers pulling from a shared study is worth the setup. The other group is researchers who want to write an optimization algorithm once and run it against a standard interface, including the project's own benchmark suite. If your tuning job finishes in a single script in under a minute, neither group describes you.

How the client-server split works in the example

The getting-started snippet in the README is short enough to read as an architecture diagram. A StudyConfig is assembled from three parts: an algorithm name, a search space, and metric information. The search space is a tree, and the example adds one parameter of each flat type to its root: add_float_param, add_int_param, add_discrete_param, add_categorical_param. MetricInformation carries the metric name and a goal, here MAXIMIZE. The config is then handed to clients.Study.from_study_config along with an owner string and a study_id, and the README notes that the Vizier Service is implicitly created if one is not already running. That implicit creation is the detail worth noticing, because it is what makes the distributed mode optional rather than mandatory. The loop then calls study.suggest(count=2), receives suggestion objects, reads suggestion.parameters as a mapping, evaluates them locally, and reports back with suggestion.complete and a Measurement. Two things follow from that shape. The service holds the trial history; the client holds the objective function. And the client is not required to be the same process, or the same machine, as the service, which is the whole point of the split. The README points to a distributed client-server animation in docs/assets, but the text does not spell out the transport beyond the grpc topic tag on the repository.

Three APIs, and which one you are actually signing up for

The documentation link in the README separates the interface into a User API, a Developer API, and a Benchmarking API, with an advanced API layered on top for TensorFlow Probability and PyGlove. These are not three products so much as three depths of commitment. The User API is the snippet above: define a search space, ask for suggestions, report measurements. The Developer API is where the abstractions for writing new optimization algorithms live, and it is the reason the project exists in open source form at all; the README says the algorithms are meant to be hosted in the service. The Benchmarking API ships a collection of objective functions and methods for comparing algorithms. A practical consequence: if you only ever touch the User API, you are paying for a service architecture to get suggestions you could have gotten from a library call. The Developer and Benchmarking APIs are where the client-server design starts to earn its keep, because a shared service is what lets a new algorithm be evaluated on the same footing as the existing ones. The README also names an algorithm paper, The Vizier Gaussian Process Bandit Algorithm, as the citation for the algorithm itself, separate from the citation for the OSS package and the citation for the original Google system.

Installation extras decide which algorithm you get

Installation is where the flexibility becomes a decision you have to make deliberately. The quick start is pip install google-vizier[jax], which the README describes as tuning with a JAX-based Bayesian optimizer. The minimal install, pip install google-vizier, pulls only the core service and client APIs from requirements.txt. The full install is pip install google-vizier[all]. In between, a specific extra X installs from requirements-X.txt, and the README lists jax, tf, algorithms, benchmarks and test as the available options. The tf extra is for Tensorflow libraries used by benchmarks, and algorithms adds repositories such as EvoJAX, while benchmarks adds things like NASBENCH-201. So the extras are not cosmetic: they determine whether a given algorithm or benchmark is importable at all. There is also a developer path, pip install google-vizier-dev[X], for installing up to the latest commit, with run_tests.sh offered as the check after a full installation. The version constraint is stated plainly: OSS Vizier requires Python 3.10+, while client-only packages require Python 3.8+. If you are pinning an older interpreter, that split is the first thing to check.

Where the service model costs you more than it returns

The clearest limitation is the one the architecture implies. A study lives in a service, so the service has to exist, be reachable, and stay alive across the run. The README says the service is implicitly created when you call from_study_config, which keeps the simple case simple, but it also means the default path starts a server you did not ask for. For a single script that tunes a handful of parameters, that is overhead with no matching benefit. A second limitation is more subtle and more likely to bite in practice: the algorithm string in the example is 'DEFAULT', and what DEFAULT resolves to depends on what was installed. The README frames the JAX extra as the route to the state-of-the-art JAX-based Bayesian optimizer, which suggests that the minimal install and the jax install do not give you the same optimizer under the same name. That is a reproducibility hazard for anyone who records a study config and expects the same behaviour on another machine. A third point the material does not settle: the README does not describe how study state is persisted, how long a study survives a service restart, or what happens to in-flight suggestions when a client dies. Those are exactly the questions a distributed service has to answer, and they are not answered in the supplied text.

What you give up compared with a single-process optimizer

The obvious alternative is a single-process Bayesian optimization library that you call directly from your training script, with no service, no client-server boundary, and no extras matrix. The difference is not the algorithm so much as where the state lives and who owns the loop. In a single-process optimizer, the search state is an object in your process; when the process exits, the state exits with it, and parallelism is something you arrange yourself. In OSS Vizier, the state lives in the service, which is what allows several workers and several users to draw suggestions from the same study without coordinating through a file or a database you wrote. That is a real capability, and it is the reason to accept the extra moving parts. The trade is that you now operate a service, and you inherit its versioning: the repository shows three releases within roughly two days in late January 2025 (v0.1.22, v0.1.23, v0.1.24), with the latest listed as v0.1.24 from 2025-02-01. Frequent point releases are normal for active projects and are not evidence of instability by themselves, but they do mean the extras and the service are moving together, and a client pinned to one release talking to a service on another is a compatibility question the README does not address.

Licence and the cost of staying current

OSS Vizier is Apache-2.0, which is a permissive licence that permits commercial use and modification, but this is a description of the licence identifier and not legal advice; read the LICENSE file and your own counsel's view before relying on it. The maintenance picture visible in the material is a Python package with a requirements-X.txt fan-out, which means upgrades are not a single version bump. Moving to a new release can mean moving the jax, tf, algorithms and benchmarks extras in step, and the developer install path (pip install google-vizier-dev[X]) tracks the latest commit rather than a release, so it is a different kind of dependency than a pinned version. The README's own verification step after a full installation is run_tests.sh, which is the concrete way to confirm an upgrade did not break the parts you use. For a team running a shared service, the upgrade cost is the service plus every client, and the README does not document a version negotiation mechanism between them. Budget for that as a coordinated change rather than a routine pip install.

Editorial conclusion

Adopt OSS Vizier if you need a persistent, multi-client optimization service, or if you are implementing and benchmarking new black-box algorithms against a shared interface. Do not adopt it for a one-off tuning run inside a single script; a plain optimizer call is less machinery. Before committing, verify two things against your own environment: that Python 3.10+ is available for the full service (client-only packages state 3.8+), and that the algorithm you intend to use is actually installed by the extra you chose, since DEFAULT behaviour depends on which requirements file was pulled in.

Official sources

  1. google/vizier on GitHub
  2. License: Apache-2.0
  3. Project website
  4. README
  5. Releases
Community notes

Community notes