-
Notifications
You must be signed in to change notification settings - Fork 5.9k
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
[core] [1/N] Validate uv options #48479
Conversation
Signed-off-by: hjiang <hjiang@anyscale.com>
e826b49
to
97bdec9
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
How about we split the PRs into:
- "uv": ["dep1", "dep2"] work e2e
- "uv": "requirements.txt" work e2e
- "uv": {} work e2e
# TODO(hjiang): More package installation options to implement: | ||
# 1. Allow users to pass in a local requirements.txt file, which relates to all | ||
# packages to install; | ||
# 2. Allow specific version of `uv` to use; as of now we only use latest version. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Default, we should use whatever version that's currently installed?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There're two possibilities:
- If we have
uv
installed in the env already, we should use it without installation; this hasn't been implemented in [core] [2/N] Implement uv processor #48486, but I left a comment - If no
uv
found in the env, we should install the default version, as you mentioned
If user specify a particular version to use, then that's another story.
|
||
The value of the input 'uv' field can be one of two cases: | ||
1) A List[str] describing the requirements. This is passed through. | ||
Example usage: "packages":["tensorflow", "requests"] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Example usage: "packages":["tensorflow", "requests"] | |
Example usage: "uv":["tensorflow", "requests"] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There're three options supported in runtime env now:
- Example: ["requests==1.0.0", "aiohttp", "ray[serve]"]
- Example: "./requirements.txt"
- Example: {"packages":["tensorflow", "requests"], "pip_check": False, "pip_version": "==22.0.2;python_version=='3.8.11'"}
I feel remove the key is better, just to reduce confusion on list vs dict, updated.
1) A List[str] describing the requirements. This is passed through. | ||
Example usage: "packages":["tensorflow", "requests"] | ||
2) A python dictionary that has three fields: | ||
a) packages (required, List[str]): a list of uv packages, it same as 1). |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
what are the other 2 fields?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sorry I don't understand, I'm trying to mimic the documentation for pip
.
ray/python/ray/_private/runtime_env/validation.py
Lines 111 to 128 in 056d596
"""Parses and validates a user-provided 'pip' option. | |
The value of the input 'pip' field can be one of two cases: | |
1) A List[str] describing the requirements. This is passed through. | |
2) A string pointing to a local requirements file. In this case, the | |
file contents will be read split into a list. | |
3) A python dictionary that has three fields: | |
a) packages (required, List[str]): a list of pip packages, it same as 1). | |
b) pip_check (optional, bool): whether to enable pip check at the end of pip | |
install, default to False. | |
c) pip_version (optional, str): the version of pip, ray will spell | |
the package name 'pip' in front of the `pip_version` to form the final | |
requirement string, the syntax of a requirement specifier is defined in | |
full in PEP 508. | |
The returned parsed value will be a list of pip packages. If a Ray library | |
(e.g. "ray[serve]") is specified, it will be deleted and replaced by its | |
dependencies (e.g. "uvicorn", "requests"). |
Could you please tell me which part am I missing here?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I mean we should support pip_check field as well and possibly uv_version field.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
About uv_version
, since the functionality is not implemented yet, I already left a TODO comment at the start of the function. IMO, only implemented feature should be officially documented.
I will definitely document it when feature implemented. Let me know if you're fine with it.
About pip_check
, my concern is it doesn't have 100% compatibility between uv
and pip
, in some cases it would report failure, check out https://github.com/astral-sh/uv/pull/2544/files
One concrete example might be, uv's pip_check
warns against multiple versions of a package, while pip version doesn't.
So I'm hesitant whether to implement it or not; but anyway I left a TODO comment at the beginning, so we don't forget to
Hi @jjyao , could you please elaborate what do you mean by e2e? Do you mean validation + download?
I plan to scope my PRs in these steps:
This way, we could keep all PRs in a controllable size, and easier to review. And it only affects production when we reach the third step. |
Signed-off-by: hjiang <dentinyhao@gmail.com>
Signed-off-by: hjiang <dentinyhao@gmail.com>
By E2E, I mean the user can uses the feature. I was trying to avoid a state where the validation passes but the underlying implementation is not there yet. |
Discussed offline, Hao will add After we have a minimal working version for |
@@ -0,0 +1,36 @@ | |||
from python.ray._private.runtime_env import validation | |||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We already have test_runtime_env_validation.py
, could you combine them?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
No plan at the moment, but I could put them in the same folder, if you want.
Let me explain my thoughts:
- They serve for different purpose. They shouldn't be placed in the same test suite. At the moment, we only have integration test for python features, which relies on the latest current version of
ray
and test on the wholeray
in principle; while I'm writing unit test, whose test target is single function or class. - They have different runtime and config. Integration test generally requires external access, while unit test is and requires hermetic and self-contained (
bazel test
put tests in a sandbox to prevent all external accesses). They usually have different runtime as well, unit tests are small and quick (bazel by default limits a test for 300 sec).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If you check TestValidatePip
it's unit test not integration test.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, but the test suite and test file overall is an integration test, which we import latest version of whole ray
.
If you're fine about it, may I move all unit test into a separate unit test file? I guess what you care about is, we should place related test in one single place?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes. Having all unit tests in one place.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sounds good! I move a few test cases into my unit test file, also moved it under tests
folder for aggregation.
TODO left for conda related test due to its dependency issue.
Signed-off-by: hjiang <dentinyhao@gmail.com>
Signed-off-by: hjiang <dentinyhao@gmail.com>
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LG
|
||
|
||
if __name__ == "__main__": | ||
unittest.main() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
sys.exit(pytest.main(["-v", "-s", __file__]))
? just to be consistent with other tests.
If we want to move away from pytest, it's a separate topic.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sadly, our current bazel setup cannot import pytest
without any pain :(
@@ -0,0 +1,121 @@ | |||
# TODO(hjiang): Move conda related unit test to this file also, after addressing the ` | |||
# yaml` third-party dependency issue. | |||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Let's follow what serve does here (python/ray/serve/tests/unit
) and create python/ray/tests/unit
. Also checkout out python/ray/serve/tests/unit/BUILD
. The rule is everything under unit
should have no import ray
.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If we take a look at the so-called unit test python/ray/serve/tests/unit
, it's still importing ray
, so still integration test sadly :(
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
But yeah, I could make another folder for unit test only, SGTM :)
Signed-off-by: hjiang <dentinyhao@gmail.com>
|
||
|
||
if __name__ == "__main__": | ||
unittest.main() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
All the other tests are run via purest, can we please use pytest as well for this PR to be consistent with the rest of code base. You can have another PR to change everything from pytest to unittest.
What's the pain of using pytest here?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What's the pain of using pytest here?
You asked in another thread, copy it here: #48486 (comment)
Signed-off-by: hjiang <dentinyhao@gmail.com>
# TODO(hjiang): Move conda related unit test to this file also, after addressing the ` | ||
# yaml` third-party dependency issue. | ||
|
||
from python.ray._private.runtime_env import validation |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Shouldn't from ray._private.runtime_env import validation
work?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Updated.
@jjyao Discussed offline, updated the implementation to use |
Signed-off-by: hjiang <hjiang@anyscale.com>
6db420b
to
d08af64
Compare
Signed-off-by: hjiang <hjiang@anyscale.com>
Signed-off-by: hjiang <hjiang@anyscale.com>
Signed-off-by: hjiang <hjiang@anyscale.com> Signed-off-by: mohitjain2504 <mohit.jain@dream11.com>
This PR is the 1st PR to add
uv
support for package installation.As discussed at #47819 (comment),
uv
would be added as another key for runtime env.Example usage:
Most of the
pip
features will be supported at the end of the day.This PR implements the runtime env validation part.
Followup TODO items:
uv
and install in the systemuv
version, instead of latest oneThis PR also includes a real unit test, relying on bazel
py_test
.My thoughts on unit tests setup:
unittest
thanpytest
:pytest
is not built-in library, for our current situation (no dependency setup on python side), using built-in libraryunittest
is more proper;assert
doesn't print out value if mismatch, while functions likeassertEqual
do, which helps debugging