Closed beckermr closed 3 years ago
Thanks @isuruf!
I don't know and I don't actually think this question is relevant to this discussion. We as conda-forge get to decide our own policies. It doesn't matter if other ppl do or don't do this. Maybe they should?
Nothing in the cfep prevents us from deprecating builds against a given epoch early. The requirements are that we have at most 2 and don't tag them more often than every six months.
I've addressed this question in the cfep above and in person. It benefits anyone wanting longer term abi stability than we currently provide. The premise that this is only corporations is not true and misguided. The group I am working with personally is a group of scientists. This particular group has already contributed to conda-forge and even offered to help with the cos7 stuff. The current system would work like aarch or ppc64le and so is consistent from a policy point of view.
I don't know and I don't actually think this question is relevant to this discussion. We as conda-forge get to decide our own policies. It doesn't matter if other ppl do or don't do this. Maybe they should?
No, it would be stupid of us not to look at what others does. No package manager doing this is a sign that this is not scalable.
Nothing in the cfep prevents us from deprecating builds against a given epoch early. The requirements are that we have at most 2 and don't tag them more often than every six months.
Then, this proposal is useless. Even if there's one package that needs to be removed, we'll have to remove all previous epochs. If not, we'll have to keep supporting a package well past its end of life just because there's an epoch that somebody needs. For eg: just because somebody needs boost-cpp, we'll have to keep supporting python X when there's no relationship between them.
The current system would work like aarch or ppc64le and so is consistent from a policy point of view.
That is only for a smaller set of packages, but here we will be doing unnecessary rebuilds for a large amount. For eg: let's say we wanted to have an older pinning with boost-cpp
. Then boost
(python bindings) need to be rebuilt. Then we'd look at the dependencies and see that there's numpy
, so then numpy
needs a build with the old epoch which is totally unnecessary.
The requirements are that we have at most 2 and don't tag them more often than every six months.
So, this is first come first serve basis? Say one person wants the pinning from 3 months ago, but they can't propose it because another person has tagged a pinning less than 6 months ago?
A few comments.
I don't personally take what other package managers do or don't do as a sign of scalability.
For deprecation, this cfep actually provides a very nice mechanism six months before a major deprecation we can remove the deprecated version from the latest pinnings and only support it in a pinning epoch. Then we let that pinning epoch run itself out. We could do that even earlier if we wanted.
Yes I envision a first come, first serve model for declaring pinnings.
For the specific case of numpy, it is in the pinnings file itself and so is not subject to this cfep. In other words, we are allowing ppl to get a build of any feedstock not in the pinnings for a small subset of the old pinning files. This specific restriction is important since it eliminates these kinds of extra builds of hard / big things in the pinnings file.
For deprecation, this cfep actually provides a very nice mechanism six months before a major deprecation we can remove the deprecated version from the latest pinnings and only support it in a pinning epoch. Then we let that pinning epoch run itself out. We could do that even earlier if we wanted.
Since, this will be opt-in, then those who didn't opt in will find that they are suddenly losing a build because they are in the latest pinning only.
Thanks for putting this in @beckermr! I would love to have this include a discussion of the epoch naming scheme (e.g. 2020.06) just so this is clear and there is no debate about it.
For the specific case of numpy, it is in the pinnings file itself and so is not subject to this cfep. In other words, we are allowing ppl to get a build of any feedstock not in the pinnings for a small subset of the old pinning files. This specific restriction is important since it eliminates these kinds of extra builds of hard / big things in the pinnings file.
Say, we have a package that depends on both scipy
and boost-cpp
, then the same argument applies and there's a needless rebuild of scipy
Since, this will be opt-in, then those who didn't opt in will find that they are suddenly losing a build because they are in the latest pinning only.
Yes, this is exactly what would happen and is exactly what we did with our latest big deprecation, python 2.7. We turned it off at some point and then provided people an admin command to add it back to the feedstock if they wanted it.
Say, we have a package that depends on both scipy and boost-cpp, then the same argument applies and there's a needless rebuild of scipy
According to the scheme above, the only time a package is rebuilt is if when rendering, conda-smithy generates a new config file in .ci_support
that is different than any of the ones in the feedstock currently. Whether or not this would happen in a specific case depends on the various pinning files involved. If the relevant pins for scipy have not moved, then the feedstock would not change upon rerendering and thus no rebuild would be needed.
I agree @scopatz. I have added a year month scheme.
@isuruf I've added the following to the spec to help eliminate a few extra rebuilds of purely >=9
-like stuff:
- Certain, forward-compatible pins corresponding to constraints like `>=9` for compiler runtimes can be copied
from the newer pinning file into the pinning epoch in order to eliminate potential rebuilds.
Yes, this is exactly what would happen and is exactly what we did with our latest big deprecation, python 2.7.
No, we supported python 2.7 until its end of life. What you're suggesting is to proactivaely remove it 6-12 months before reaching its end of life.
No this is not right. Remember that the potential scheme I suggested is official support too. Should we accept this CFEP, the pinning epochs would be a sanctioned part of conda-forge with the support that entails. Removing a build of a release reaching end of life from latest and onto a pinning epoch doesn't mean we don't support it. It means that to use the older build, one would have to enable it. This is the same as supporting aarch or ppc64le or anything else we have really.
In any case, I want to focus the discussion on a way forward with this CFEP.
Removing a build of a release reaching end of life from latest and onto a pinning epoch doesn't mean we don't support it. It means that to use the older build, one would have to enable it.
Why? This way you are forcing everybody into this scheme and besides it's only with older pinning and not newer pinning either.
This is the same as supporting aarch or ppc64le or anything else we have really.
No, it's not. We are not dropping aarch or ppc64le.
In any case, I want to focus the discussion on a way forward with this CFEP.
I don't understand. What do you want to do?
I think we are splitting hairs on what support means in the context of conda forge. This specific deprecation scheme is not a part or even required by this cfep.
What I mean by a way forward is that (I am pretty sure) we have users who have a need for more ABI stability. I want to find a way to meet this need. If it is not this CFEP in its current form, that is totally fine by me. However, I'd like to continue working toward providing this. Instead right now we seem to be caught up in fine details and not focusing on the bigger picture.
I'm a bit confused by the mentioned "unnecessary rebuilds". From what I have understood the PE proposal is that we would build new versions of a feedstock with an old set of pinnings. Thus we would expand the build matrix in the packages that are not part of the pinnings file but wouldn't touch the builds of the pinned packages.
I'm a bit confused by the mentioned "unnecessary rebuilds". From what I have understood the PE proposal is that we would build new versions of a feedstock with an old set of pinnings. Thus we would expand the build matrix in the packages that are not part of the pinnings file but wouldn't touch the builds of the pinned packages.
I agree @xhochy. Most of the rebuilds seem needed. There is an edge case for compilers where if everything else is the same, we can use a build with say clang 9 at runtime with clang 10. We can adjust the pinnings file to prevent these which i've added to the spec.
So, my read of the text is that this CFEP would basically start conda-forge having Long-Term Support (LTS) release branches. (The term does show up once in the CFEP text.) On the one hand, I think that the general Linux distro experience has shown that having an LTS branch can be very valuable and useful for a lot of people. On the other hand, it would probably be a nontrivial amount of effort to support — it's right there in the name.
Perhaps we should try to acquire some more data about how useful this feature would be to our userbase? I'm not a fan of decision-by-survey, but it's also not obvious to me how else to gather information — perhaps look at download trends for older versions of common core packages, to try to get a sense as to how many people are locking on to older versions for stability?
As another thought, would it be at all feasible to somehow prototype this concept outside of mainline conda-forge, and "merge it in" if successful? I'm pretty sure that the answer is "no", since so much depends on the build and update infrastructure. But in general, I think this concept is going to have a lot of uncertainty about both the costs and the benefits, and in those circumstances you want to prototype or otherwise start small. Perhaps one path forward would be to give the idea a trial run, maintaining an LTS branch for a year or so, and evaluate and make a decision about whether we feel that it's worthwhile to continue support or not.
Agreed @pkgw that we don't have a ton of good info on who might use this. I know of at least one group personally. @xhochy mentioned the arrow folks might as well. OTOH, this has not stopped us from adding features or making changes in the past. So I don't think we should condition this specific issue on a survey or the like.
The original draft of this CFEP used the term "long-term support" in it. We moved away from the term "long-term support" because sometimes people connotate that with backports of critical bug fixes and the like. We are not proposing to do any backports of that nature here, and so we went with the term "pinning epoch" instead.
A prototype is ~impossible to standup given how things are now. :/
I'm a bit confused by the mentioned "unnecessary rebuilds". From what I have understood the PE proposal is that we would build new versions of a feedstock with an old set of pinnings. Thus we would expand the build matrix in the packages that are not part of the pinnings file but wouldn't touch the builds of the pinned packages.
See my example with scipy. We'll be re-building it just because the compiler version is bumped, but there's no reason to do it. Let's also mention that the only use-case we have right now is for boost
and this proposal is taking it to another level.
See my example with scipy. We'll be re-building it just because the compiler version is bumped, but there's no reason to do it.
@isuruf See my change to the proposal and the comment I left here: https://github.com/conda-forge/cfep/pull/35#issuecomment-664078424
I've eliminated this issue.
Here is an example of a subset of a diff one gets for scipy against a pinning file from January.
diff --git a/.ci_support/linux_ppc64le_numpy1.16python3.8.____cpython.yaml b/.ci_support/linux_ppc64le_python3.8.____cpython.yaml
similarity index 93%
rename from .ci_support/linux_ppc64le_numpy1.16python3.8.____cpython.yaml
rename to .ci_support/linux_ppc64le_python3.8.____cpython.yaml
index 0213c17..9c7c0ea 100644
--- a/.ci_support/linux_ppc64le_numpy1.16python3.8.____cpython.yaml
+++ b/.ci_support/linux_ppc64le_python3.8.____cpython.yaml
@@ -30,6 +30,3 @@ pin_run_as_build:
max_pin: x.x
python:
- 3.8.* *_cpython
-zip_keys:
-- - numpy
- - python
diff --git a/.ci_support/linux_numpy1.16python3.6.____cpython.yaml b/.ci_support/linux_python3.6.____cpython.yaml
similarity index 91%
rename from .ci_support/linux_numpy1.16python3.6.____cpython.yaml
rename to .ci_support/linux_python3.6.____cpython.yaml
index c77e7e3..17a66df 100644
--- a/.ci_support/linux_numpy1.16python3.6.____cpython.yaml
+++ b/.ci_support/linux_python3.6.____cpython.yaml
@@ -23,13 +23,10 @@ libcblas:
liblapack:
- 3.8.0 *netlib
numpy:
-- '1.16'
+- '1.14'
pin_run_as_build:
python:
min_pin: x.x
max_pin: x.x
python:
- 3.6.* *_cpython
-zip_keys:
-- - numpy
- - python
There are two features here:
The zip_keys block that was removed is from the pypy migration yaml. This is a special case and we could potentially code around it in smithy by having smithy remove any excess zip keys blocks in the final configs.
The minimum version of numpy for building has changed. This might fall under our forward-compatible pins can be updated rule, which would eliminate that build.
Thus I don't think the proposal as stated would generate rebuilds if we are careful.
Here is the pinnings file. I adjusted the pinning file to use the current compiler runtimes and channels per the CFEP.
Also, if we kept the numpy min version, that is 3 more builds than we had, which is pretty small.
I've adjusted the text again to make sure we state that we can/will adjust the pinnings to avoid extra rebuilds including cases like big deprecations.
@conda-forge/core Are we ok to merge this as deferred?
Hi @conda-forge/core!
After a bunch of the feedback from last time, I have posted a new version of the pinning epochs CFEP for comments.