Google Vizier as Open Source: A Python Service for Black-Box and Hyperparameter Optimization
Python-based research interface for blackbox and hyperparameter optimization, based on the internal Google Vizier Service.
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 built for teams that need distributed suggestion loops and algorithm research, not for one-off tuning scripts.
- Who is it for?
- Adopt OSS Vizier if you need a persistent, multi-client optimization service that separates algorithm development from the tuning loop, and if you can run Python 3.10 or newer for the full install. Do not adopt it for a single short tuning run that scikit-optimize or Optuna would cover in one process, and do not adopt it if you cannot absorb the dependency weight of the jax or all extras.
- 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 2 days 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 October 1, 2026, and from our analysis. They are not legal advice.
Editorial analysis
What OSS Vizier solves, and who it is actually for
The README describes OSS Vizier as a Python-based service for black-box optimization and research, based on Google Vizier, which it calls one of the first hyperparameter tuning services designed to work at scale. The phrase that matters is at scale. A single-process tuner holds its state in memory and dies with the script. Vizier splits the optimizer from the caller, so several workers can request suggestions from the same study and report measurements back to it.
The intended audience is split three ways by the documented APIs. The User API is for people who want to optimize an objective and optionally stand up a server for distributed multi-client settings. The Developer API is for researchers implementing new optimization algorithms to be hosted in the service. The Benchmarking API is for comparing algorithms against a collection of objective functions.
That third group is the one most tuning libraries ignore. If you are writing a paper about acquisition functions, you need a harness where your algorithm and a baseline run under identical suggestion semantics. Vizier treats that as a first-class use case rather than an afterthought. If you only want to tune a gradient boosted model before lunch, the service framing is more machinery than the task needs.
How the client-server mechanism works
The README shows a distributed client-server system, and the code sample makes the data flow concrete. You build a StudyConfig that carries three things: an algorithm name, a search space, and metric information. The search space root accepts float, int, discrete and categorical parameters. MetricInformation carries a name and a goal, in the sample ObjectiveMetricGoal.MAXIMIZE.
From that config you call clients.Study.from_study_config with an owner and a study_id. The README notes the Vizier Service will be implicitly created if you do not supply one, which is why the sample runs without any server setup. The loop then alternates: study.suggest(count=2) returns suggestions, you read suggestion.parameters, evaluate them yourself, and call suggestion.complete with a Measurement keyed by the metric name. The service never calls your objective function. It only sees parameter values going out and measurements coming back.
That boundary is the whole design. The objective stays in your process, where your data and your GPUs are. The suggestion logic stays in the service, where it can keep state across clients. It also means the service is blind to anything you do not report as a Measurement, so a crash between suggest and complete leaves the trial unresolved unless your own code handles it.
Installing OSS Vizier and running a first study
The README gives four installation paths. The quick start targets the JAX-based Bayesian optimizer. The minimal install pulls only the core service and client APIs from requirements.txt. The full install adds all algorithms and benchmarks. The specific install takes an extra name X and resolves it against requirements-X.txt, with jax, tf, algorithms, benchmarks and test listed as the possible options. A developer install, google-vizier-dev[X], installs up to the latest commit.
pip install google-vizier[jax]After that, the README's own example is the shortest path to a working study. It maximizes a four-parameter objective over a float, an int, a discrete value and a category, running ten rounds of two suggestions each.
from vizier.service import clients
from vizier.service import pyvizier as vz
def evaluate(w: float, x: int, y: float, z: str) -> float:
return w**2 - y**2 + x * ord(z)
study_config = vz.StudyConfig(algorithm='DEFAULT')
study_config.search_space.root.add_float_param('w', 0.0, 5.0)
study_config.search_space.root.add_int_param('x', -2, 2)
study_config.search_space.root.add_discrete_param('y', [0.3, 7.2])
study_config.search_space.root.add_categorical_param('z', ['a', 'g', 'k'])
study_config.metric_information.append(
vz.MetricInformation('metric_name', goal=vz.ObjectiveMetricGoal.MAXIMIZE))With the config in place, the loop below creates the study, asks for suggestions, evaluates each one locally and reports the result back. The owner and study_id strings are yours to choose.
study = clients.Study.from_study_config(
study_config, owner='my_name', study_id='example')
for i in range(10):
suggestions = study.suggest(count=2)
for suggestion in suggestions:
params = suggestion.parameters
objective = evaluate(params['w'], params['x'], params['y'], params['z'])
suggestion.complete(vz.Measurement({'metric_name': objective}))What you should see is a study that accumulates ten rounds of measurements and, on the DEFAULT algorithm, stops behaving like random search once it has enough completed trials to model the space. The README does not state how many trials that takes, so treat early-round behavior as unverified until you plot it yourself. The README also points to run_tests.sh as the way to check that all unit tests pass after a full installation, which is worth running before you trust a fresh environment.
Where the service model gets in the way
The implicit service creation in the sample is convenient and also the source of the sharpest edge. A study identified by owner and study_id is meant to be durable. If your orchestration recreates the process on every job, you are paying for a service while getting the semantics of a local tuner, and the accumulated measurements that make the algorithm useful may not survive in the place you expect.
The dependency split is a second constraint. The minimal install is deliberately thin, and the README lists the extras that carry the rest: jax libraries shared by algorithms and benchmarks, Tensorflow libraries used by benchmarks, additional repositories such as EvoJAX for algorithms, and NASBENCH-201 among the benchmark additions. Pulling google-vizier[all] to get one algorithm drags in benchmark tooling you will never call. Choose the narrowest extra that covers your algorithm.
Version requirements are stated plainly and are worth reading before you plan a migration. OSS Vizier requires Python 3.10 or newer, while client-only packages require Python 3.8 or newer. A team on an older interpreter can still write a client, but cannot host the full service. That asymmetry is easy to miss when the install line looks identical in both cases.
How OSS Vizier differs from Optuna and scikit-optimize
Optuna and scikit-optimize both solve hyperparameter optimization in a single Python process by default. You define an objective, the sampler lives in the same interpreter, and the study is an object you hold. scikit-optimize is a library of surrogate-model minimizers with no service layer at all. Optuna adds storage backends so several processes can share a study, which is the closest functional overlap with Vizier's distributed story.
The difference is where the algorithm boundary sits. Vizier's Developer API is defined for implementing new optimization algorithms and hosting them in the service, and the README points to TensorFlow Probability and Flax for writing Bayesian optimization algorithms inside that framework. Optuna's sampler interface is likewise extensible, but Vizier's Benchmarking API ships a collection of objective functions and methods to benchmark and compare algorithms, which is a research harness rather than a tuning convenience. If your goal is to publish a comparison of acquisition functions, that harness is the reason to pick Vizier. If your goal is to find good hyperparameters for a model you are shipping this week, the harness is weight you will not use.
Maintenance, versions and the Apache-2.0 licence
The repository is not archived, and the last push was on 2026-09-09. The most recent tagged release in the repository is v0.1.24 from 2025-02-01, with v0.1.23 and v0.1.22 both tagged on 2025-01-31. The gap between the latest tag and the latest push means the main branch carries work that has not been cut into a release, so pinning to a tag and tracking main are different commitments.
Upgrade cost is dominated by the extras. Because dependencies are resolved per requirements-X.txt file, moving from google-vizier[jax] to google-vizier[all] changes your dependency set substantially, and the Tensorflow libraries used by benchmarks are the heaviest part. Upgrading the core package without changing extras is the cheaper move, but the README does not document a deprecation policy or a rollback procedure, so treat any version bump as something to validate against your own study rather than something the documentation will guide you through.
The project is licensed under Apache-2.0, and setup.py carries the standard Apache header with the copyright line naming Google LLC. That is a permissive licence with an explicit patent grant and a requirement to preserve notices. It is not legal advice, and if you are redistributing a modified Vizier inside a product, have counsel read the notice and modification clauses rather than relying on a summary.
Editorial conclusion
Adopt OSS Vizier if you need a persistent, multi-client optimization service that separates algorithm development from the tuning loop, and if you can run Python 3.10 or newer for the full install. Do not adopt it for a single short tuning run that scikit-optimize or Optuna would cover in one process, and do not adopt it if you cannot absorb the dependency weight of the jax or all extras. Verify first that the DEFAULT algorithm on your own search space beats random search, and check that your serving layer can hold a long-lived study rather than restarting one per job.
Frequently asked questions
What is google-vizier and what is it used for?
It is a Python-based service for black-box optimization and research, based on the internal Google Vizier service. It is used to tune black-box objectives, to implement and host new optimization algorithms, and to benchmark algorithms against a collection of objective functions.
how to use vizier
Build a StudyConfig with an algorithm, a search space and metric information, create a study with clients.Study.from_study_config, then loop over study.suggest and report each result with suggestion.complete. The README's example runs ten rounds of two suggestions on a four-parameter objective.
Which Python versions does OSS Vizier require?
The README states that OSS Vizier requires Python 3.10 or newer, while client-only packages require Python 3.8 or newer. A team on an older interpreter can write a client but cannot host the full service.
What is the difference between the jax, all and minimal installs of google-vizier?
The quick start installs google-vizier[jax] for the JAX-based Bayesian optimizer, the minimal install pulls only the core service and client APIs from requirements.txt, and google-vizier[all] supports all algorithms and benchmarks. A specific extra X installs the add-ons listed in requirements-X.txt.
Does OSS Vizier call my objective function for me?
No. The client asks for suggestions, evaluates the parameters itself, and reports the result back as a Measurement keyed by the metric name. The service sees parameter values and measurements, not your data or your code.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/google-vizier)