Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

Unable to scale in instances group instance_count to 0

Abierto
#347 2 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
3/5
Tiempo estimado
1-2 días
Aptitud para principiantes
38/100
Tipo de issue
Error
Claridad
Necesita aclaración
Estado de actividad
Estancado
Stack tecnológico
aws, python
Área
cli, cloud

Línea de trabajo

Reproduce el comando mostrado hyp update cluster con instance_count establecido en 0 y, después, inspecciona update_cluster en sagemaker/hyperpod/cli/commands/cluster_stack.py y el wrapper de validación en sagemaker_core/main/resources.py. Se considera terminado cuando la actualización acepta cero instancias sin el traceback indicado y la actualización del clúster se completa correctamente.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

When I set instance_count to 0

cluster_name="hyp-cluster"
hyp update cluster --cluster-name $cluster_name \
    --instance-groups '[{
        "instance_group_name": "xxx",
        "instance_type": "ml.g5.2xlarge",
        "instance_count": 0,
        "execution_role": "arn:aws:iam::123456789012:role/hyp-clusterExecRole",
        "life_cycle_config": {
            "source_s3_uri": "s3://hyp-bucket",
            "on_create": "on_create.sh"
        }
    }]'

Error message as following

INFO:sagemaker_core.main.resources:Updating cluster resource.
╭─────────────────────────────── Traceback (most recent call last) ────────────────────────────────╮
│ /Users/qruwang/pyenv/base/bin/hyp:7 in <module>                                                  │
│                                                                                                  │
│   4 if __name__ == '__main__':                                                                   │
│   5 │   if sys.argv[0].endswith('.exe'):                                                         │
│   6 │   │   sys.argv[0] = sys.argv[0][:-4]                                                       │
│ ❱ 7 │   sys.exit(cli())                                                                          │
│   8                                                                                              │
│                                                                                                  │
│ /Users/qruwang/pyenv/base/lib/python3.13/site-packages/click/core.py:1157 in __call__            │
│                                                                                                  │
│   1154 │                                                                                         │
│   1155 │   def __call__(self, *args: t.Any, **kwargs: t.Any) -> t.Any:                           │
│   1156 │   │   """Alias for :meth:`main`."""                                                     │
│ ❱ 1157 │   │   return self.main(*args, **kwargs)                                                 │
│   1158                                                                                           │
│   1159                                                                                           │
│   1160 class Command(BaseCommand):                                                               │
│                                                                                                  │
│ /Users/qruwang/pyenv/base/lib/python3.13/site-packages/click/core.py:1078 in main                │
│                                                                                                  │
│   1075 │   │   try:                                                                              │
│   1076 │   │   │   try:                                                                          │
│   1077 │   │   │   │   with self.make_context(prog_name, args, **extra) as ctx:                  │
│ ❱ 1078 │   │   │   │   │   rv = self.invoke(ctx)                                                 │
│   1079 │   │   │   │   │   if not standalone_mode:                                               │
│   1080 │   │   │   │   │   │   return rv                                                         │
│   1081 │   │   │   │   │   # it's not safe to `ctx.exit(rv)` here!                               │
│                                                                                                  │
│ /Users/qruwang/pyenv/base/lib/python3.13/site-packages/click/core.py:1688 in invoke              │
│                                                                                                  │
│   1685 │   │   │   │   super().invoke(ctx)                                                       │
│   1686 │   │   │   │   sub_ctx = cmd.make_context(cmd_name, args, parent=ctx)                    │
│   1687 │   │   │   │   with sub_ctx:                                                             │
│ ❱ 1688 │   │   │   │   │   return _process_result(sub_ctx.command.invoke(sub_ctx))               │
│   1689 │   │                                                                                     │
│   1690 │   │   # In chain mode we create the contexts step by step, but after the                │
│   1691 │   │   # base command has been invoked.  Because at that point we do not                 │
│                                                                                                  │
│ /Users/qruwang/pyenv/base/lib/python3.13/site-packages/click/core.py:1688 in invoke              │
│                                                                                                  │
│   1685 │   │   │   │   super().invoke(ctx)                                                       │
│   1686 │   │   │   │   sub_ctx = cmd.make_context(cmd_name, args, parent=ctx)                    │
│   1687 │   │   │   │   with sub_ctx:                                                             │
│ ❱ 1688 │   │   │   │   │   return _process_result(sub_ctx.command.invoke(sub_ctx))               │
│   1689 │   │                                                                                     │
│   1690 │   │   # In chain mode we create the contexts step by step, but after the                │
│   1691 │   │   # base command has been invoked.  Because at that point we do not                 │
│                                                                                                  │
│ /Users/qruwang/pyenv/base/lib/python3.13/site-packages/click/core.py:1434 in invoke              │
│                                                                                                  │
│   1431 │   │   │   echo(style(message, fg="red"), err=True)                                      │
│   1432 │   │                                                                                     │
│   1433 │   │   if self.callback is not None:                                                     │
│ ❱ 1434 │   │   │   return ctx.invoke(self.callback, **ctx.params)                                │
│   1435 │                                                                                         │
│   1436 │   def shell_complete(self, ctx: Context, incomplete: str) -> t.List["CompletionItem"]:  │
│   1437 │   │   """Return a list of completions for the incomplete value. Looks                   │
│                                                                                                  │
│ /Users/qruwang/pyenv/base/lib/python3.13/site-packages/click/core.py:783 in invoke               │
│                                                                                                  │
│    780 │   │                                                                                     │
│    781 │   │   with augment_usage_errors(__self):                                                │
│    782 │   │   │   with ctx:                                                                     │
│ ❱  783 │   │   │   │   return __callback(*args, **kwargs)                                        │
│    784 │                                                                                         │
│    785 │   def forward(                                                                          │
│    786 │   │   __self, __cmd: "Command", *args: t.Any, **kwargs: t.Any  # noqa: B902             │
│                                                                                                  │
│ /Users/qruwang/pyenv/base/lib/python3.13/site-packages/sagemaker/hyperpod/common/telemetry/telem │
│ etry_logging.py:179 in wrapper                                                                   │
│                                                                                                  │
│   176 │   │   │                                                                                  │
│   177 │   │   │   start = perf_counter()                                                         │
│   178 │   │   │   try:                                                                           │
│ ❱ 179 │   │   │   │   result = func(*args, **kwargs)                                             │
│   180 │   │   │   │   duration = round(perf_counter() - start, 2)                                │
│   181 │   │   │   │   extra += f"&x-latency={duration}"                                          │
│   182 │   │   │   │   _send_telemetry_request(                                                   │
│                                                                                                  │
│ /Users/qruwang/pyenv/base/lib/python3.13/site-packages/sagemaker/hyperpod/cli/commands/cluster_s │
│ tack.py:389 in update_cluster                                                                    │
│                                                                                                  │
│   386 │   │   update_params['node_recovery'] = node_recovery                                     │
│   387 │                                                                                          │
│   388 │   click.secho(f"Update Params: {update_params}")                                         │
│ ❱ 389 │   cluster.update(**update_params)                                                        │
│   390 │                                                                                          │
│   391 │   logger.info("Cluster has been updated")                                                │
│   392 │   click.secho(f"Cluster {cluster_name} has been updated")                                │
│                                                                                                  │
│ /Users/qruwang/pyenv/base/lib/python3.13/site-packages/sagemaker_core/main/resources.py:3278 in  │
│ wrapper                                                                                          │
│                                                                                                  │
│    3275 │   │   │   │   },                                                                       │
│    3276 │   │   │   │   "cluster_role": {"type": "string"},                                      │
│    3277 │   │   │   }                                                                            │
│ ❱  3278 │   │   │   return create_func(                                                          │
│    3279 │   │   │   │   *args,                                                                   │
│    3280 │   │   │   │   **Base.get_updated_kwargs_with_configured_attributes(                    │
│    3281 │   │   │   │   │   config_schema_for_resource, "Cluster", **kwargs                      │
│                                                                                                  │
│ /Users/qruwang/pyenv/base/lib/python3.13/site-packages/sagemaker_core/main/resources.py:140 in   │
│ wrapper                                                                                          │
│                                                                                                  │
│     137 │   │   @functools.wraps(func)                                                           │
│     138 │   │   def wrapper(*args, **kwargs):                                                    │
│     139 │   │   │   config = dict(arbitrary_types_allowed=True)                                  │
│ ❱   140 │   │   │   return validate_call(config=config)(func)(*args, **kwargs)                   │
│     141 │   │                                                                                    │
│     142 │   │   return wrapper                                                                   │
│     143                                                                                          │
│                                                                                                  │
│ /Users/qruwang/pyenv/base/lib/python3.13/site-packages/pydantic/_internal/_validate_call.py:39   │
│ in wrapper_function                                                                              │
│                                                                                                  │
│    36 │   │                                                                                      │
│    37 │   │   @functools.wraps(wrapped)                                                          │
│    38 │   │   def wrapper_function(*args, **kwargs):                                             │
│ ❱  39 │   │   │   return wrapper(*args, **kwargs)                                                │
│    40 │                                                                                          │
│    41 │   # We need to manually update this because `partial` object has no `__name__` and `__   │
│    42 │   wrapper_function.__name__ = extract_function_name(wrapped)                             │
│                                                                                                  │
│ /Users/qruwang/pyenv/base/lib/python3.13/site-packages/pydantic/_internal/_validate_call.py:136  │
│ in __call__                                                                                      │
│                                                                                                  │
│   133 │   │   if not self.__pydantic_complete__:                                                 │
│   134 │   │   │   self._create_validators()                                                      │
│   135 │   │                                                                                      │
│ ❱ 136 │   │   res = self.__pydantic_validator__.validate_python(pydantic_core.ArgsKwargs(args,   │
│   137 │   │   if self.__return_pydantic_validator__:                                             │
│   138 │   │   │   return self.__return_pydantic_validator__(res)                                 │
│   139 │   │   else:                                                                              │
│                                                                                                  │
│ /Users/qruwang/pyenv/base/lib/python3.13/site-packages/sagemaker_core/main/resources.py:3527 in  │
│ update                                                                                           │
│                                                                                                  │
│    3524 │   │   logger.debug(f"Serialized input request: {operation_input_args}")                │
│    3525 │   │                                                                                    │
│    3526 │   │   # create the resource                                                            │
│ ❱  3527 │   │   response = client.update_cluster(**operation_input_args)                         │
│    3528 │   │   logger.debug(f"Response: {response}")                                            │
│    3529 │   │   self.refresh()                                                                   │
│    3530                                                                                          │
│                                                                                                  │
│ /Users/qruwang/pyenv/base/lib/python3.13/site-packages/botocore/client.py:602 in _api_call       │
│                                                                                                  │
│    599 │   │   │   │   │   f"{py_operation_name}() only accepts keyword arguments."              │
│    600 │   │   │   │   )                                                                         │
│    601 │   │   │   # The "self" in this scope is referring to the BaseClient.                    │
│ ❱  602 │   │   │   return self._make_api_call(operation_name, kwargs)                            │
│    603 │   │                                                                                     │
│    604 │   │   _api_call.__name__ = str(py_operation_name)                                       │
│    605                                                                                           │
│                                                                                                  │
│ /Users/qruwang/pyenv/base/lib/python3.13/site-packages/botocore/context.py:123 in wrapper        │
│                                                                                                  │
│   120 │   │   │   with start_as_current_context():                                               │
│   121 │   │   │   │   if hook:                                                                   │
│   122 │   │   │   │   │   hook()                                                                 │
│ ❱ 123 │   │   │   │   return func(*args, **kwargs)                                               │
│   124 │   │                                                                                      │
│   125 │   │   return wrapper                                                                     │
│   126                                                                                            │
│                                                                                                  │
│ /Users/qruwang/pyenv/base/lib/python3.13/site-packages/botocore/client.py:1035 in _make_api_call │
│                                                                                                  │
│   1032 │   │   │   # Pass arbitrary endpoint info with the Request                               │
│   1033 │   │   │   # for use during construction.                                                │
│   1034 │   │   │   request_context['endpoint_properties'] = properties                           │
│ ❱ 1035 │   │   request_dict = self._convert_to_request_dict(                                     │
│   1036 │   │   │   api_params=api_params,                                                        │
│   1037 │   │   │   operation_model=operation_model,                                              │
│   1038 │   │   │   endpoint_url=endpoint_url,                                                    │
│                                                                                                  │
│ /Users/qruwang/pyenv/base/lib/python3.13/site-packages/botocore/client.py:1102 in                │
│ _convert_to_request_dict                                                                         │
│                                                                                                  │
│   1099 │   │   headers=None,                                                                     │
│   1100 │   │   set_user_agent_header=True,                                                       │
│   1101 │   ):                                                                                    │
│ ❱ 1102 │   │   request_dict = self._serializer.serialize_to_request(                             │
│   1103 │   │   │   api_params, operation_model                                                   │
│   1104 │   │   )                                                                                 │
│   1105 │   │   if not self._client_config.inject_host_prefix:                                    │
│                                                                                                  │
│ /Users/qruwang/pyenv/base/lib/python3.13/site-packages/botocore/validate.py:381 in               │
│ serialize_to_request                                                                             │
│                                                                                                  │
│   378 │   │   │   │   parameters, operation_model.input_shape                                    │
│   379 │   │   │   )                                                                              │
│   380 │   │   │   if report.has_errors():                                                        │
│ ❱ 381 │   │   │   │   raise ParamValidationError(report=report.generate_report())                │
│   382 │   │   return self._serializer.serialize_to_request(                                      │
│   383 │   │   │   parameters, operation_model                                                    │
│   384 │   │   )                                                                                  │
╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
ParamValidationError: Parameter validation failed:
Missing required parameter in InstanceGroups[0]: "InstanceCount"

I can only set instance_count on console

Lenguaje dominante
Python
Estrellas
41
Forks
95
Merge medio
18 h 29 min
PR fusionados (30 d)
5

Preparar el entorno

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de aws/sagemaker-hyperpod-cli

Todos los issues de aws/sagemaker-hyperpod-cli

Issues similares

Más issues de Python

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.