Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: CLI command 'feast serve' should start go-based server if flag is enabled #2617

Merged
merged 3 commits into from
Apr 27, 2022

Conversation

tsotnet
Copy link
Collaborator

@tsotnet tsotnet commented Apr 27, 2022

Signed-off-by: Tsotne Tabidze [email protected]

What this PR does / why we need it: Currently, if you enable go feature server by adding go_feature_retrieval: True in the feature_store.yaml config, it only affects the Python SDK (FeatureStore.get_online_features). This PR implements changes in the CLI, so that if you run feast serve in terminal and this flag is enabled, it'll start a Go-based feature server instead of the Python equivalent.

Note, that this does not start a separate Go subprocess. The initial Python process will keep running, while Go logic is dynamically linked to the same process. This allows the serving to be done natively in Go, while ODFVs can just call back to the initial Python logic to run the transformations with minimal overhead.

This PR only adds gRPC server though. In the next PR we'll add the HTTP serving capabilities as well.

I tested this PR by running feast init, adding the go_feature_retrieval flag to the YAML file and by running feast serve after materialization. Separately I opened Python notebook and run the following:

In [8]: from feast.protos.feast.types.Value_pb2 import RepeatedValue, Value
   ...: from feast.protos.feast.serving.ServingService_pb2 import GetOnlineFeaturesRequest, FeatureList
   ...: from feast.protos.feast.serving.ServingService_pb2_grpc import ServingServiceStub
   ...: import grpc
   ...:
   ...: request = GetOnlineFeaturesRequest(
   ...:     features=FeatureList(val=[
   ...:         "driver_hourly_stats:conv_rate",
   ...:         "driver_hourly_stats:acc_rate",
   ...:         "driver_hourly_stats:avg_daily_trips"
   ...:     ]),
   ...:     entities={
   ...:         "driver_id": RepeatedValue(val=[
   ...:             Value(int64_val=1001),
   ...:             Value(int64_val=1002),
   ...:             Value(int64_val=1003)
   ...:         ])
   ...:     }
   ...: )
   ...:
   ...: stub = ServingServiceStub(grpc.insecure_channel('localhost:6566'))
   ...: stub.GetOnlineFeatures(request)
Out[8]:
metadata {
  feature_names {
    val: "driver_id"
    val: "conv_rate"
    val: "acc_rate"
    val: "avg_daily_trips"
  }
}
results {
  values {
    int64_val: 1001
  }
  values {
    int64_val: 1002
  }
  values {
    int64_val: 1003
  }
  statuses: PRESENT
  statuses: PRESENT
  statuses: PRESENT
  event_timestamps {
    seconds: 1651044665
    nanos: 234880000
  }
  event_timestamps {
    seconds: 1651044665
    nanos: 234880000
  }
  event_timestamps {
    seconds: 1651044665
    nanos: 234880000
  }
}
results {
  values {
    float_val: 0.053211748600006104
  }
  values {
    float_val: 0.5894963145256042
  }
  values {
    float_val: 0.055955931544303894
  }
  statuses: PRESENT
  statuses: PRESENT
  statuses: PRESENT
  event_timestamps {
    seconds: 1651003200
  }
  event_timestamps {
    seconds: 1651003200
  }
  event_timestamps {
    seconds: 1651003200
  }
}
results {
  values {
    float_val: 0.030293632298707962
  }
  values {
    float_val: 0.21737541258335114
  }
  values {
    float_val: 0.6582370400428772
  }
  statuses: PRESENT
  statuses: PRESENT
  statuses: PRESENT
  event_timestamps {
    seconds: 1651003200
  }
  event_timestamps {
    seconds: 1651003200
  }
  event_timestamps {
    seconds: 1651003200
  }
}
results {
  values {
    int64_val: 738
  }
  values {
    int64_val: 145
  }
  values {
    int64_val: 831
  }
  statuses: PRESENT
  statuses: PRESENT
  statuses: PRESENT
  event_timestamps {
    seconds: 1651003200
  }
  event_timestamps {
    seconds: 1651003200
  }
  event_timestamps {
    seconds: 1651003200
  }
}

As you can see, the server is able to respond to the input request using protobuf I/O.


I also fixed 2 unrelated bugs in this PR that I came across:

  1. make compile-go-lib was outdated. I needed to change the command to build_ext since the command got renamed at some point, add COMPILE_GO=True env variable to actually compile the go code, and --inplace flag to move the generated stuff to the actual source code location.
  2. There was a bug with sqlite online store. When the sqlite online store type was explicitly included in feature_store.yaml file (which was the case when running feast init), Go was complaining that this type wasn't supported even though it was. I fixed the logic for this.

Which issue(s) this PR fixes:

Fixes #

Tsotne Tabidze added 2 commits April 27, 2022 01:17
@tsotnet tsotnet added the kind/feature New feature or request label Apr 27, 2022
@tsotnet tsotnet requested a review from pyalex April 27, 2022 08:19
@codecov-commenter
Copy link

codecov-commenter commented Apr 27, 2022

Codecov Report

Merging #2617 (d6e98a2) into master (134dc5f) will decrease coverage by 0.05%.
The diff coverage is 58.33%.

@@            Coverage Diff             @@
##           master    #2617      +/-   ##
==========================================
- Coverage   81.65%   81.59%   -0.06%     
==========================================
  Files         161      161              
  Lines       13297    13304       +7     
==========================================
- Hits        10857    10856       -1     
- Misses       2440     2448       +8     
Flag Coverage Δ
integrationtests 72.56% <58.33%> (-0.28%) ⬇️
unittests 59.40% <20.00%> (-0.02%) ⬇️

Flags with carried forward coverage won't be shown. Click here to find out more.

Impacted Files Coverage Δ
...ython/feast/embedded_go/online_features_service.py 95.04% <50.00%> (-1.93%) ⬇️
sdk/python/feast/feature_store.py 89.23% <60.00%> (-0.38%) ⬇️
...ation/feature_repos/universal/data_sources/file.py 68.81% <0.00%> (-1.08%) ⬇️
.../integration/online_store/test_universal_online.py 95.18% <0.00%> (-0.69%) ⬇️

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 134dc5f...d6e98a2. Read the comment docs.

@tsotnet tsotnet changed the title feat: 'feast serve' should start go-based server if flag is enabled feat: CLI command 'feast serve' should start go-based server if flag is enabled Apr 27, 2022
@feast-ci-bot
Copy link
Collaborator

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: pyalex, tsotnet

The full list of commands accepted by this bot can be found here.

The pull request process is described here

Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@pyalex
Copy link
Collaborator

pyalex commented Apr 27, 2022

/lgtm

@feast-ci-bot feast-ci-bot merged commit f3ff812 into master Apr 27, 2022
achals pushed a commit that referenced this pull request May 13, 2022
# [0.21.0](v0.20.0...v0.21.0) (2022-05-13)

### Bug Fixes

* Addresses ZeroDivisionError when materializing file source with same timestamps ([#2551](#2551)) ([1e398d9](1e398d9))
* Asynchronously refresh registry for the feast ui command ([#2672](#2672)) ([1b09ca2](1b09ca2))
* Build platform specific python packages with ci-build-wheel ([#2555](#2555)) ([b10a4cf](b10a4cf))
* Delete data sources from registry when using the diffing logic ([#2669](#2669)) ([fc00ca8](fc00ca8))
* Enforce kw args featureservice ([#2575](#2575)) ([160d7b7](160d7b7))
* Enforce kw args in datasources ([#2567](#2567)) ([0b7ec53](0b7ec53))
* Feature logging to Redshift is broken ([#2655](#2655)) ([479cd51](479cd51))
* Feature service to templates ([#2649](#2649)) ([1e02066](1e02066))
* Feature with timestamp type is incorrectly interpreted by Go FS ([#2588](#2588)) ([e3d9588](e3d9588))
* Fix `__hash__` methods ([#2556](#2556)) ([ebb7dfe](ebb7dfe))
* Fix AWS bootstrap template ([#2604](#2604)) ([c94a69c](c94a69c))
* Fix broken proto conversion methods for data sources ([#2603](#2603)) ([00ed65a](00ed65a))
* Fix case where on demand feature view tab is broken if no custom tabs are passed.  ([#2682](#2682)) ([01d3568](01d3568))
* Fix DynamoDB fetches when there are entities that are not found ([#2573](#2573)) ([7076fe0](7076fe0))
* Fix Feast UI parser to work with new APIs ([#2668](#2668)) ([8d76751](8d76751))
* Fix java server after odfv update ([#2602](#2602)) ([0ca6297](0ca6297))
* Fix materialization with ttl=0 bug ([#2666](#2666)) ([ab78702](ab78702))
* Fix push sources and add docs / tests pushing via the python feature server ([#2561](#2561)) ([e8e418e](e8e418e))
* Fixed data mapping errors for Snowflake ([#2558](#2558)) ([53c2ce2](53c2ce2))
* Forcing ODFV udfs to be __main__ module and fixing false positive duplicate data source warning ([#2677](#2677)) ([2ce33cd](2ce33cd))
* Include the ui/build directory, and remove package data ([#2681](#2681)) ([0384f5f](0384f5f))
* Infer features for feature services when they depend on feature views without schemas ([#2653](#2653)) ([87c194c](87c194c))
* Pin dependencies to nearest major version ([#2647](#2647)) ([bb72b7c](bb72b7c))
* Pin pip<22.1 to get around breaking change in pip==22.1 ([#2678](#2678)) ([d3e01bc](d3e01bc))
* Punt deprecation warnings and clean up some warnings. ([#2670](#2670)) ([f775d2e](f775d2e))
* Reject undefined features when using `get_historical_features` or `get_online_features` ([#2665](#2665)) ([36849fb](36849fb))
* Remove ci extra from the feature transformation server dockerfile ([#2618](#2618)) ([25613b4](25613b4))
* Remove incorrect call to logging.basicConfig ([#2676](#2676)) ([8cbf51c](8cbf51c))
* Small typo in CLI ([#2578](#2578)) ([f372981](f372981))
* Switch from `join_key` to `join_keys` in tests and docs ([#2580](#2580)) ([d66c931](d66c931))
* Teardown trino container correctly after tests ([#2562](#2562)) ([72f1558](72f1558))
* Update build_go_protos to use a consistent python path ([#2550](#2550)) ([f136f8c](f136f8c))
* Update data source timestamp inference error message to make sense ([#2636](#2636)) ([3eaf6b7](3eaf6b7))
* Update field api to add tag parameter corresponding to labels in Feature. ([#2610](#2610)) ([689d20b](689d20b))
* Update java integration tests and add more logging ([#2637](#2637)) ([10e23b4](10e23b4))
* Update on demand feature view api ([#2587](#2587)) ([38cd7f9](38cd7f9))
* Update RedisCluster to use redis-py official implementation ([#2554](#2554)) ([ce5606f](ce5606f))
* Use cwd when getting module path ([#2577](#2577)) ([b550e59](b550e59))
* Use ParquetDataset for Schema Inference ([#2686](#2686)) ([4f85e3e](4f85e3e))
* Use timestamp type when converting unixtimestamp feature type to arrow ([#2593](#2593)) ([c439611](c439611))

### Features

* Add hbase online store support in feast ([#2590](#2590)) ([c9eda79](c9eda79))
* Adding SSL options for Postgres ([#2644](#2644)) ([0e809c2](0e809c2))
* Allow Feast UI to be spun up with CLI command: feast ui ([#2667](#2667)) ([44ca9f5](44ca9f5))
* Allow to pass secrets and environment variables to transformation service ([#2632](#2632)) ([ffa33ad](ffa33ad))
* CLI command 'feast serve' should start go-based server if flag is enabled ([#2617](#2617)) ([f3ff812](f3ff812))
* Create stream and batch feature view abstractions ([#2559](#2559)) ([d1f76e5](d1f76e5))
* Postgres supported as Registry, Online store, and Offline store ([#2401](#2401)) ([ed2f979](ed2f979))
* Support entity fields in feature view `schema` parameter by dropping them ([#2568](#2568)) ([c8fcc35](c8fcc35))
* Write logged features to an offline store (Python API) ([#2574](#2574)) ([134dc5f](134dc5f))
* Write logged features to Offline Store (Go - Python integration) ([#2621](#2621)) ([ccad832](ccad832))

### Reverts

* Revert "chore: Deprecate value type (#2611)" (#2643) ([4fbdfb1](4fbdfb1)), closes [#2611](#2611) [#2643](#2643)
@adchia adchia deleted the tsotne/go-grpc-server-2 branch April 22, 2023 04:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants