Skip to content

Commit d11da07

Browse files
feat: add experimental python 3.14t feature server
1 parent f630056 commit d11da07

19 files changed

Lines changed: 855 additions & 559 deletions

.dockerignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,5 @@ env
66
offline_build/
77
!offline_build/arrow
88
!offline_build/ibis
9+
ui/node_modules
10+
sdk/python/feast/ui/node_modules

Makefile

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -683,6 +683,15 @@ build-feature-server-docker: ## Build Feature Server Docker image
683683
-f sdk/python/feast/infra/feature_servers/multicloud/Dockerfile \
684684
$(if $(filter true,$(DOCKER_PUSH)),--push,--load) sdk/python/feast/infra/feature_servers/multicloud
685685

686+
push-feature-server-experimental-docker: ## Push experimental Python 3.14 free-threaded Feature Server Docker image
687+
docker push $(REGISTRY)/feature-server:$(VERSION)-python314t-experimental
688+
689+
build-feature-server-experimental-docker: ## Build experimental Python 3.14 free-threaded Feature Server Docker image
690+
docker buildx build $(if $(DOCKER_PLATFORMS),--platform $(DOCKER_PLATFORMS),) \
691+
-t $(REGISTRY)/feature-server:$(VERSION)-python314t-experimental \
692+
-f sdk/python/feast/infra/feature_servers/multicloud/Dockerfile.experimental \
693+
$(if $(filter true,$(DOCKER_PUSH)),--push,--load) .
694+
686695
push-feature-transformation-server-docker: ## Push Feature Transformation Server Docker image
687696
docker push $(REGISTRY)/feature-transformation-server:$(VERSION)
688697

@@ -733,6 +742,11 @@ build-feature-server-dev: ## Build Feature Server Dev Docker image
733742
-t feastdev/feature-server:dev \
734743
-f sdk/python/feast/infra/feature_servers/multicloud/Dockerfile.dev --load .
735744

745+
benchmark-feature-server-experimental: ## Benchmark stable vs experimental feature server containers
746+
uv run python infra/scripts/benchmark_feature_server_experimental.py \
747+
--baseline-image $(REGISTRY)/feature-server:$(VERSION) \
748+
--experimental-image $(REGISTRY)/feature-server:$(VERSION)-python314t-experimental
749+
736750
build-feature-server-dev-docker: ## Build Feature Server Dev Docker image
737751
docker buildx build $(if $(DOCKER_PLATFORMS),--platform $(DOCKER_PLATFORMS),) \
738752
-t $(REGISTRY)/feature-server:$(VERSION) \

docs/project/development-guide.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,18 @@ make compile-protos-python
166166
docker build -t docker-whale -f ./sdk/python/feast/infra/feature_servers/multicloud/Dockerfile .
167167
```
168168

169+
### Building the experimental Python 3.14 free-threaded feature server image
170+
```sh
171+
make build-feature-server-experimental-docker
172+
173+
# Optional: compare it to the stable image with the sample local repo
174+
make benchmark-feature-server-experimental
175+
```
176+
177+
This experimental image is currently aimed at early compatibility and performance testing for the Python feature server. The benchmark target compares the stable and experimental containers against the sample local repo and is currently most representative for SQLite-backed serving experiments.
178+
179+
In the current SQLite benchmark run, the experimental `3.14t` image reached `157.01 req/s` versus `187.65 req/s` for the stable image, while improving p95 latency from `274.72 ms` to `262.61 ms`. Treat that as an early data point rather than a universal result: the free-threaded stack is still evolving, and dependency behavior can outweigh any no-GIL gains on a given workload.
180+
169181
### Code Style and Linting
170182
Feast Python SDK and CLI codebase:
171183
- Conforms to [Black code style](https://black.readthedocs.io/en/stable/the_black_code_style/current_style.html)

docs/reference/feature-servers/python-feature-server.md

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,32 @@ Key performance options:
5353
- Use HTTP health checks instead of TCP for better application-level monitoring
5454
- Consider horizontal pod autoscaling based on request latency metrics
5555

56+
### Experimental Python 3.14 Free-Threaded Container
57+
58+
Feast also ships an experimental feature-server container build for Python 3.14 free-threaded (`3.14t`) runtimes. This image is intended for benchmarking and early compatibility validation, not as the default production image.
59+
60+
Today, the experimental image is best treated as a SQLite-oriented serving experiment. The online-serving startup path has been trimmed to avoid eagerly importing `pandas`, which makes it a better fit for free-threaded serving benchmarks, but the broader Feast runtime and some offline-oriented paths still rely on dependencies that are not fully optimized for no-GIL execution yet.
61+
62+
```bash
63+
# Build the stable image
64+
make build-feature-server-docker
65+
66+
# Build the experimental no-GIL image
67+
make build-feature-server-experimental-docker
68+
69+
# Compare the two images against the same sample feature repo
70+
make benchmark-feature-server-experimental
71+
```
72+
73+
The benchmark target writes a JSON report to `feature-server-experimental-benchmark.json` with throughput and latency comparisons for the stable and experimental containers. The current harness uses the sample local feature repo and is most useful for side-by-side SQLite serving comparisons. Because the free-threaded Python ecosystem is still evolving, treat the result as a workload-specific experiment and validate dependency compatibility before promoting it further.
74+
75+
On the current SQLite benchmark run that seeded this experiment, the experimental `3.14t` image delivered lower throughput but slightly better tail latency than the stable image:
76+
77+
- Stable image: `187.65 req/s`, `152.17 ms` mean latency, `274.72 ms` p95 latency, `35` failed requests
78+
- Experimental image: `157.01 req/s`, `183.21 ms` mean latency, `262.61 ms` p95 latency, `31` failed requests
79+
80+
That works out to about `16%` lower throughput for the experimental image, alongside about `4.6%` better p95 latency on this workload. In other words, the current no-GIL image is not yet a clear performance win for SQLite online serving, but it is now easy to benchmark and iterate on as dependencies improve.
81+
5682
## Deploying as a service
5783

5884
See [this](../../how-to-guides/running-feast-in-production.md#id-4.2.-deploy-feast-feature-servers-on-kubernetes) for an example on how to run Feast on Kubernetes using the Operator.
@@ -536,4 +562,4 @@ The [PyTorch NLP template](https://github.com/feast-dev/feast/tree/main/sdk/pyth
536562

537563
## How to configure Authentication and Authorization ?
538564

539-
Please refer the [page](./../../../docs/getting-started/concepts/permission.md) for more details on how to configure authentication and authorization.
565+
Please refer the [page](./../../../docs/getting-started/concepts/permission.md) for more details on how to configure authentication and authorization.

0 commit comments

Comments
 (0)