-
Notifications
You must be signed in to change notification settings - Fork 3
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
fix!: variable scaling, pressure level scalings only applied in specific circumstances #52
base: develop
Are you sure you want to change the base?
fix!: variable scaling, pressure level scalings only applied in specific circumstances #52
Conversation
Please consider using the knowledge about variables that come from the dataset metadata. See https://github.com/ecmwf/anemoi-transform/blob/7cbf5f3d4baa37453022a5a97e17cc71a5b8ceeb/src/anemoi/transform/variables/__init__.py#L47 |
We have given this some thought, and after wanting to use the information from the dataset in the beginning, I have opted for allowing the definition of our own groups here to use different scaling for self-defined groups. |
…umstances' of https://github.com/ecmwf/anemoi-core into 7-pressure-level-scalings-only-applied-in-specific-circumstances
|
Hi, I would like to know what you think about making all scalers explicit in the config file. Something similar to the |
Seems like a good idea! Would you like to add this in this PR? |
I’m not sure what the best approach is. On the one hand, adding more work to this PR would increase its complexity, which might make it more logical to address this refactor in a future PR. On the other hand, this PR already introduces some changes to the configs, and the future PRs would also involve changes to the configs. From this, it might be better to have 1 PR and communicate all the changes to users at once. What do you think? |
I'm happy for it to be included in this PR! Not sure if @sahahner or @mc4117 have other views? |
for more information, see https://pre-commit.ci
for more information, see https://pre-commit.ci
…umstances' of github.com:ecmwf/anemoi-core into 7-pressure-level-scalings-only-applied-in-specific-circumstances
…umstances' of https://github.com/ecmwf/anemoi-core into 7-pressure-level-scalings-only-applied-in-specific-circumstances
for more information, see https://pre-commit.ci
@jakob-schloer @HCookie could you review this please? |
…umstances' of github.com:ecmwf/anemoi-core into 7-pressure-level-scalings-only-applied-in-specific-circumstances
if isinstance(config_container, list): | ||
scalar = [ | ||
( | ||
instantiate( | ||
scalar_config, | ||
scaling_config=config.training.variable_loss_scaling, | ||
data_indices=data_indices, | ||
statistics=statistics, | ||
statistics_tendencies=statistics_tendencies, | ||
) | ||
if scalar_config["name"] == "tendency" | ||
else instantiate( | ||
scalar_config, | ||
scaling_config=config.training.variable_loss_scaling, | ||
data_indices=data_indices, |
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.
Given that the tendency scalar is a subclass of the same generic Scalar base class this overly specific if
should be removed. My suggestion would be to add to the statistics, & tendencies
to the base class and leave the usage up to the implementation.
if TYPE_CHECKING: | ||
from omegaconf import DictConfig | ||
from anemoi.models.data_indices.collection import IndexCollection |
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.
This will raise an issue once the CI is back, this block should be after any other imports.
class BaseVariableLossScaler(ABC): | ||
"""Configurable method converting variable to loss scaling.""" | ||
|
||
def __init__( | ||
self, | ||
scaling_config: DictConfig, | ||
data_indices: IndexCollection, | ||
metadata_variables: dict | None = None, | ||
) -> None: | ||
"""Initialise Scaler. |
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.
Could it make sense to further 'genericsize' this class? BaseLossScalar
?
variable_groups: | ||
default: sfc | ||
pl: [q, t, u, v, w, z] |
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.
A comment on the use of this would be useful here
self.default_group = self.scaling_config.variable_groups.default | ||
self.metadata_variables = metadata_variables | ||
|
||
self.ExtractVariableGroupAndLevel = ExtractVariableGroupAndLevel( |
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.
The variable should not be camel case, and instead snake_case
) | ||
|
||
@abstractmethod | ||
def get_variable_scaling(self) -> np.ndarray: ... |
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.
A quick documentation here on what this method is expected to return would be good
class GeneralVariableLossScaler(BaseVariableLossScaler): | ||
"""General scaling of variables to loss scaling.""" |
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.
This documentation is hard to read, maybe I'm just missing the point.
Solve the problem explained in issue #7 by refactoring the variable scalings into a general variable scaling and a pressure level scaling.
@mc4117 , @pinnstorm and me came up with a new structure. This PR implements this.
This is first draft. Feedback very welcome!