From bde0c3547936a77aa0334fba578ba1f6e347fb8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AD=90=E7=90=A6?= Date: Fri, 24 Oct 2025 14:24:08 +0800 Subject: [PATCH 1/8] Supports multiple input suffixes for global_segment_size MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 李子琦 --- .../feature_guide/kv_pool_mooncake.md | 2 +- .../distributed/mooncake/test_config_data.py | 66 ++++++++++++++ .../distributed/mooncake/config_data.py | 91 ++++++++++++++++++- 3 files changed, 154 insertions(+), 5 deletions(-) create mode 100644 tests/ut/distributed/mooncake/test_config_data.py diff --git a/docs/source/user_guide/feature_guide/kv_pool_mooncake.md b/docs/source/user_guide/feature_guide/kv_pool_mooncake.md index a9c61cd1ad5..1b727648e13 100644 --- a/docs/source/user_guide/feature_guide/kv_pool_mooncake.md +++ b/docs/source/user_guide/feature_guide/kv_pool_mooncake.md @@ -41,7 +41,7 @@ The environment variable **MOONCAKE_CONFIG_PATH** is configured to the full path "use_ascend_direct": true, "alloc_in_same_node": true, "master_server_address": "xx.xx.xx.xx:50088", - "global_segment_size": 30000000000 + "global_segment_size": "1GB/1024MB/1048576KB/1073741824B" or 1073741824 } ``` diff --git a/tests/ut/distributed/mooncake/test_config_data.py b/tests/ut/distributed/mooncake/test_config_data.py new file mode 100644 index 00000000000..9ad4ea3b573 --- /dev/null +++ b/tests/ut/distributed/mooncake/test_config_data.py @@ -0,0 +1,66 @@ +import unittest + +from vllm_ascend.distributed.mooncake.config_data import ( + _parse_global_segment_size, _convert_to_bytes) + + +class TestParseGlobalSegmentSize(unittest.TestCase): + def test_int_input(self): + self.assertEqual(_parse_global_segment_size(1024), 1024) + self.assertEqual(_parse_global_segment_size(0), 0) + + def test_gb_unit(self): + self.assertEqual(_parse_global_segment_size("2GB"), 2 * 1024**3) + self.assertEqual(_parse_global_segment_size("1.5GB"), int(1.5 * 1024**3)) + self.assertEqual(_parse_global_segment_size(" 2 GB "), 2 * 1024**3) + + def test_gb_unit_edge_cases(self): + with self.assertRaises(ValueError): + _parse_global_segment_size("GB") + with self.assertRaises(ValueError): + _parse_global_segment_size("abcGB") + + def test_mb_unit(self): + self.assertEqual(_parse_global_segment_size("512MB"), 512 * 1024**2) + self.assertEqual(_parse_global_segment_size("0.5MB"), int(0.5 * 1024**2)) + self.assertEqual(_parse_global_segment_size("1024MB"), 1024 * 1024**2) + + def test_kb_unit(self): + self.assertEqual(_parse_global_segment_size("256KB"), 256 * 1024) + self.assertEqual(_parse_global_segment_size("1.25KB"), int(1.25 * 1024)) + + def test_b_unit(self): + self.assertEqual(_parse_global_segment_size("4096B"), 4096) + self.assertEqual(_parse_global_segment_size("1024b"), 1024) + + def test_no_unit(self): + self.assertEqual(_parse_global_segment_size("2048"), 2048) + self.assertEqual(_parse_global_segment_size("0"), 0) + + def test_non_string_non_int_input(self): + self.assertEqual(_parse_global_segment_size(2048.0), 2048) + self.assertEqual(_parse_global_segment_size(True), 1) + + with self.assertRaises(TypeError): + _parse_global_segment_size(None) + + with self.assertRaises(TypeError): + _parse_global_segment_size({"size": 1024}) + + +class TestConvertToBytes(unittest.TestCase): + def test_valid_conversion(self): + self.assertEqual(_convert_to_bytes("10", 1, "10"), 10) + self.assertEqual(_convert_to_bytes("1.5", 1024, "1.5KB"), int(1.5 * 1024)) + self.assertEqual(_convert_to_bytes("0", 1024**3, "0GB"), 0) + + def test_invalid_numbers(self): + with self.assertRaises(ValueError): + _convert_to_bytes("abc", 1, "abc") + + with self.assertRaises(ValueError): + _convert_to_bytes("1.2.3", 1024, "1.2.3KB") + + +if __name__ == '__main__': + unittest.main() \ No newline at end of file diff --git a/vllm_ascend/distributed/mooncake/config_data.py b/vllm_ascend/distributed/mooncake/config_data.py index 745d91131fa..d7acba9e9b9 100644 --- a/vllm_ascend/distributed/mooncake/config_data.py +++ b/vllm_ascend/distributed/mooncake/config_data.py @@ -2,6 +2,7 @@ import hashlib import json import os +from typing import Union from dataclasses import dataclass from typing import Iterable, List, Optional, Tuple, Union @@ -11,6 +12,8 @@ from vllm.utils import cdiv, logger from vllm.v1.core.sched.output import NewRequestData +DEFAULT_GLOBAL_SEGMENT_SIZE = 3355443200 # 3.125 GiB +DEFAULT_LOCAL_BUFFER_SIZE = 1073741824 # 1.0 GiB @dataclass class MooncakeEngineMetadata: @@ -419,7 +422,7 @@ class LasyerMultiBlockReqMeta: class MooncakeStoreConfig: local_hostname: str metadata_server: str - global_segment_size: int + global_segment_size: Union[int, str] local_buffer_size: int protocol: str device_name: str @@ -433,8 +436,10 @@ def from_file(file_path: str) -> "MooncakeStoreConfig": return MooncakeStoreConfig( local_hostname=config.get("local_hostname"), metadata_server=config.get("metadata_server"), - global_segment_size=config.get("global_segment_size", 3355443200), - local_buffer_size=config.get("local_buffer_size", 1073741824), + global_segment_size=_parse_global_segment_size( + config.get("global_segment_size", DEFAULT_GLOBAL_SEGMENT_SIZE) + ), + local_buffer_size=config.get("local_buffer_size", DEFAULT_LOCAL_BUFFER_SIZE), protocol=config.get("protocol", "tcp"), device_name=config.get("device_name", ""), master_server_address=config.get("master_server_address"), @@ -446,4 +451,82 @@ def load_from_env() -> "MooncakeStoreConfig": if not config_path: raise ValueError( "The environment variable 'MOONCAKE_CONFIG_PATH' is not set.") - return MooncakeStoreConfig.from_file(config_path) \ No newline at end of file + return MooncakeStoreConfig.from_file(config_path) + + +def _parse_global_segment_size(value) -> int: + """ + Parse storage size strings with support for units: GB, MB, KB, B + + Args: + value: Input value (int, str, or other convertible types) + + Returns: + int: Size in bytes + + Raises: + ValueError: For invalid format, missing number, or negative values + TypeError: For unsupported input types + """ + + if isinstance(value, int): + return value + elif not isinstance(value, str): + try: + return int(value) + except (TypeError, ValueError) as e: + raise TypeError( + f"Unsupported type for global_segment_size: {type(value)}" + ) from e + # Clean input string + cleaned_input = value.strip().lower() + if not cleaned_input: + raise ValueError("global segment size cannot be empty.") + + UNIT_MULTIPLIERS = { + 'gb': 1024 ** 3, # 1 GB = 1024^3 bytes + 'mb': 1024 ** 2, # 1 MB = 1024^2 bytes + 'kb': 1024, # 1 KB = 1024 bytes + 'b': 1 # 1 B = 1 byte + } + # Check for unit suffixes + for unit, multiplier in UNIT_MULTIPLIERS.items(): + if cleaned_input.endswith(unit): + number_part = cleaned_input[:-len(unit)].strip() + if not number_part: + raise ValueError( + f"Missing numeric value before unit '{unit}' in: '{value}'" + ) + return _convert_to_bytes(number_part, multiplier, value) + # Handle unit-less input (bytes) + return _convert_to_bytes(cleaned_input, 1, value) + + +def _convert_to_bytes(number_str: str, multiplier: int, + original_input: str) -> int: + """ + Convert numeric string to byte count + + Args: + number_str: Numeric portion of input + multiplier: Unit conversion factor + original_input: Original input string (for error messages) + + Returns: + int: Byte count + + Raises: + ValueError: For invalid numbers or negative results + """ + try: + numeric_value = float(number_str) + except ValueError: + raise ValueError( + f"Invalid numeric value '{number_str}' in: '{original_input}'" + ) + # Calculate byte count + try: + byte_count = int(numeric_value * multiplier) + except OverflowError: + raise ValueError(f"Storage size too large: '{original_input}'") + return byte_count From a683669edefa9d343958fe77c13bbbc6ef11efdf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AD=90=E7=90=A6?= Date: Fri, 24 Oct 2025 16:34:22 +0800 Subject: [PATCH 2/8] change doc MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 李子琦 --- .../feature_guide/kv_pool_mooncake.md | 2 +- .../distributed/mooncake/test_config_data.py | 28 +++++++++++-------- .../distributed/mooncake/config_data.py | 20 ++++++------- 3 files changed, 28 insertions(+), 22 deletions(-) diff --git a/docs/source/user_guide/feature_guide/kv_pool_mooncake.md b/docs/source/user_guide/feature_guide/kv_pool_mooncake.md index 1b727648e13..8134caf4aab 100644 --- a/docs/source/user_guide/feature_guide/kv_pool_mooncake.md +++ b/docs/source/user_guide/feature_guide/kv_pool_mooncake.md @@ -41,7 +41,7 @@ The environment variable **MOONCAKE_CONFIG_PATH** is configured to the full path "use_ascend_direct": true, "alloc_in_same_node": true, "master_server_address": "xx.xx.xx.xx:50088", - "global_segment_size": "1GB/1024MB/1048576KB/1073741824B" or 1073741824 + "global_segment_size": "1GB" (1024MB/1048576KB/1073741824B/1073741824) } ``` diff --git a/tests/ut/distributed/mooncake/test_config_data.py b/tests/ut/distributed/mooncake/test_config_data.py index 9ad4ea3b573..e94edc8e169 100644 --- a/tests/ut/distributed/mooncake/test_config_data.py +++ b/tests/ut/distributed/mooncake/test_config_data.py @@ -1,7 +1,7 @@ import unittest from vllm_ascend.distributed.mooncake.config_data import ( - _parse_global_segment_size, _convert_to_bytes) + _convert_to_bytes, _parse_global_segment_size) class TestParseGlobalSegmentSize(unittest.TestCase): @@ -11,23 +11,29 @@ def test_int_input(self): def test_gb_unit(self): self.assertEqual(_parse_global_segment_size("2GB"), 2 * 1024**3) - self.assertEqual(_parse_global_segment_size("1.5GB"), int(1.5 * 1024**3)) + self.assertEqual(_parse_global_segment_size("1.5GB"), + int(1.5 * 1024**3)) self.assertEqual(_parse_global_segment_size(" 2 GB "), 2 * 1024**3) def test_gb_unit_edge_cases(self): with self.assertRaises(ValueError): + _parse_global_segment_size("GB") + with self.assertRaises(ValueError): - _parse_global_segment_size("abcGB") + + _parse_global_segment_size("abcGB") def test_mb_unit(self): self.assertEqual(_parse_global_segment_size("512MB"), 512 * 1024**2) - self.assertEqual(_parse_global_segment_size("0.5MB"), int(0.5 * 1024**2)) + self.assertEqual(_parse_global_segment_size("0.5MB"), + int(0.5 * 1024**2)) self.assertEqual(_parse_global_segment_size("1024MB"), 1024 * 1024**2) def test_kb_unit(self): self.assertEqual(_parse_global_segment_size("256KB"), 256 * 1024) - self.assertEqual(_parse_global_segment_size("1.25KB"), int(1.25 * 1024)) + self.assertEqual(_parse_global_segment_size("1.25KB"), + int(1.25 * 1024)) def test_b_unit(self): self.assertEqual(_parse_global_segment_size("4096B"), 4096) @@ -42,16 +48,19 @@ def test_non_string_non_int_input(self): self.assertEqual(_parse_global_segment_size(True), 1) with self.assertRaises(TypeError): - _parse_global_segment_size(None) + + _parse_global_segment_size(None) with self.assertRaises(TypeError): - _parse_global_segment_size({"size": 1024}) + + _parse_global_segment_size({"size": 1024}) class TestConvertToBytes(unittest.TestCase): def test_valid_conversion(self): self.assertEqual(_convert_to_bytes("10", 1, "10"), 10) - self.assertEqual(_convert_to_bytes("1.5", 1024, "1.5KB"), int(1.5 * 1024)) + self.assertEqual(_convert_to_bytes("1.5", 1024, "1.5KB"), + int(1.5 * 1024)) self.assertEqual(_convert_to_bytes("0", 1024**3, "0GB"), 0) def test_invalid_numbers(self): @@ -61,6 +70,3 @@ def test_invalid_numbers(self): with self.assertRaises(ValueError): _convert_to_bytes("1.2.3", 1024, "1.2.3KB") - -if __name__ == '__main__': - unittest.main() \ No newline at end of file diff --git a/vllm_ascend/distributed/mooncake/config_data.py b/vllm_ascend/distributed/mooncake/config_data.py index d7acba9e9b9..122d26b2697 100644 --- a/vllm_ascend/distributed/mooncake/config_data.py +++ b/vllm_ascend/distributed/mooncake/config_data.py @@ -2,7 +2,6 @@ import hashlib import json import os -from typing import Union from dataclasses import dataclass from typing import Iterable, List, Optional, Tuple, Union @@ -437,9 +436,11 @@ def from_file(file_path: str) -> "MooncakeStoreConfig": local_hostname=config.get("local_hostname"), metadata_server=config.get("metadata_server"), global_segment_size=_parse_global_segment_size( - config.get("global_segment_size", DEFAULT_GLOBAL_SEGMENT_SIZE) + config.get("global_segment_size", + DEFAULT_GLOBAL_SEGMENT_SIZE) ), - local_buffer_size=config.get("local_buffer_size", DEFAULT_LOCAL_BUFFER_SIZE), + local_buffer_size=config.get("local_buffer_size", + DEFAULT_LOCAL_BUFFER_SIZE), protocol=config.get("protocol", "tcp"), device_name=config.get("device_name", ""), master_server_address=config.get("master_server_address"), @@ -484,10 +485,10 @@ def _parse_global_segment_size(value) -> int: raise ValueError("global segment size cannot be empty.") UNIT_MULTIPLIERS = { - 'gb': 1024 ** 3, # 1 GB = 1024^3 bytes - 'mb': 1024 ** 2, # 1 MB = 1024^2 bytes - 'kb': 1024, # 1 KB = 1024 bytes - 'b': 1 # 1 B = 1 byte + 'gb': 1024**3, # 1 GB = 1024^3 bytes + 'mb': 1024**2, # 1 MB = 1024^2 bytes + 'kb': 1024, # 1 KB = 1024 bytes + 'b': 1 # 1 B = 1 byte } # Check for unit suffixes for unit, multiplier in UNIT_MULTIPLIERS.items(): @@ -502,7 +503,7 @@ def _parse_global_segment_size(value) -> int: return _convert_to_bytes(cleaned_input, 1, value) -def _convert_to_bytes(number_str: str, multiplier: int, +def _convert_to_bytes(number_str: str, multiplier: int, original_input: str) -> int: """ Convert numeric string to byte count @@ -522,8 +523,7 @@ def _convert_to_bytes(number_str: str, multiplier: int, numeric_value = float(number_str) except ValueError: raise ValueError( - f"Invalid numeric value '{number_str}' in: '{original_input}'" - ) + f"Invalid numeric value '{number_str}' in: '{original_input}'") # Calculate byte count try: byte_count = int(numeric_value * multiplier) From 08ffdfac30fcd260a5e7279e9e5de1c435537c26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AD=90=E7=90=A6?= Date: Sat, 25 Oct 2025 09:13:00 +0800 Subject: [PATCH 3/8] fix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 李子琦 --- tests/ut/distributed/mooncake/test_config_data.py | 4 ++-- vllm_ascend/distributed/mooncake/config_data.py | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/tests/ut/distributed/mooncake/test_config_data.py b/tests/ut/distributed/mooncake/test_config_data.py index e94edc8e169..bca17f911a2 100644 --- a/tests/ut/distributed/mooncake/test_config_data.py +++ b/tests/ut/distributed/mooncake/test_config_data.py @@ -26,7 +26,7 @@ def test_gb_unit_edge_cases(self): def test_mb_unit(self): self.assertEqual(_parse_global_segment_size("512MB"), 512 * 1024**2) - self.assertEqual(_parse_global_segment_size("0.5MB"), + self.assertEqual(_parse_global_segment_size("0.5MB"), int(0.5 * 1024**2)) self.assertEqual(_parse_global_segment_size("1024MB"), 1024 * 1024**2) @@ -59,7 +59,7 @@ def test_non_string_non_int_input(self): class TestConvertToBytes(unittest.TestCase): def test_valid_conversion(self): self.assertEqual(_convert_to_bytes("10", 1, "10"), 10) - self.assertEqual(_convert_to_bytes("1.5", 1024, "1.5KB"), + self.assertEqual(_convert_to_bytes("1.5", 1024, "1.5KB"), int(1.5 * 1024)) self.assertEqual(_convert_to_bytes("0", 1024**3, "0GB"), 0) diff --git a/vllm_ascend/distributed/mooncake/config_data.py b/vllm_ascend/distributed/mooncake/config_data.py index 122d26b2697..dbd825d7e01 100644 --- a/vllm_ascend/distributed/mooncake/config_data.py +++ b/vllm_ascend/distributed/mooncake/config_data.py @@ -437,8 +437,7 @@ def from_file(file_path: str) -> "MooncakeStoreConfig": metadata_server=config.get("metadata_server"), global_segment_size=_parse_global_segment_size( config.get("global_segment_size", - DEFAULT_GLOBAL_SEGMENT_SIZE) - ), + DEFAULT_GLOBAL_SEGMENT_SIZE)), local_buffer_size=config.get("local_buffer_size", DEFAULT_LOCAL_BUFFER_SIZE), protocol=config.get("protocol", "tcp"), From 1db3c8bd035452599448eb65310ddee543b505ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AD=90=E7=90=A6?= Date: Mon, 27 Oct 2025 10:37:17 +0800 Subject: [PATCH 4/8] fix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 李子琦 --- .../distributed/mooncake/test_config_data.py | 11 ++--- .../distributed/mooncake/config_data.py | 42 +++++++++---------- 2 files changed, 24 insertions(+), 29 deletions(-) diff --git a/tests/ut/distributed/mooncake/test_config_data.py b/tests/ut/distributed/mooncake/test_config_data.py index bca17f911a2..3a6b425eb23 100644 --- a/tests/ut/distributed/mooncake/test_config_data.py +++ b/tests/ut/distributed/mooncake/test_config_data.py @@ -17,11 +17,8 @@ def test_gb_unit(self): def test_gb_unit_edge_cases(self): with self.assertRaises(ValueError): - _parse_global_segment_size("GB") - with self.assertRaises(ValueError): - _parse_global_segment_size("abcGB") def test_mb_unit(self): @@ -29,7 +26,7 @@ def test_mb_unit(self): self.assertEqual(_parse_global_segment_size("0.5MB"), int(0.5 * 1024**2)) self.assertEqual(_parse_global_segment_size("1024MB"), 1024 * 1024**2) - + def test_kb_unit(self): self.assertEqual(_parse_global_segment_size("256KB"), 256 * 1024) self.assertEqual(_parse_global_segment_size("1.25KB"), @@ -42,17 +39,15 @@ def test_b_unit(self): def test_no_unit(self): self.assertEqual(_parse_global_segment_size("2048"), 2048) self.assertEqual(_parse_global_segment_size("0"), 0) - + def test_non_string_non_int_input(self): self.assertEqual(_parse_global_segment_size(2048.0), 2048) self.assertEqual(_parse_global_segment_size(True), 1) with self.assertRaises(TypeError): - _parse_global_segment_size(None) with self.assertRaises(TypeError): - _parse_global_segment_size({"size": 1024}) @@ -62,7 +57,7 @@ def test_valid_conversion(self): self.assertEqual(_convert_to_bytes("1.5", 1024, "1.5KB"), int(1.5 * 1024)) self.assertEqual(_convert_to_bytes("0", 1024**3, "0GB"), 0) - + def test_invalid_numbers(self): with self.assertRaises(ValueError): _convert_to_bytes("abc", 1, "abc") diff --git a/vllm_ascend/distributed/mooncake/config_data.py b/vllm_ascend/distributed/mooncake/config_data.py index dbd825d7e01..216651c109f 100644 --- a/vllm_ascend/distributed/mooncake/config_data.py +++ b/vllm_ascend/distributed/mooncake/config_data.py @@ -2,6 +2,7 @@ import hashlib import json import os +import re from dataclasses import dataclass from typing import Iterable, List, Optional, Tuple, Union @@ -438,8 +439,8 @@ def from_file(file_path: str) -> "MooncakeStoreConfig": global_segment_size=_parse_global_segment_size( config.get("global_segment_size", DEFAULT_GLOBAL_SEGMENT_SIZE)), - local_buffer_size=config.get("local_buffer_size", - DEFAULT_LOCAL_BUFFER_SIZE), + local_buffer_size=(config.get("local_buffer_size", + DEFAULT_LOCAL_BUFFER_SIZE)), protocol=config.get("protocol", "tcp"), device_name=config.get("device_name", ""), master_server_address=config.get("master_server_address"), @@ -478,32 +479,31 @@ def _parse_global_segment_size(value) -> int: raise TypeError( f"Unsupported type for global_segment_size: {type(value)}" ) from e - # Clean input string + cleaned_input = value.strip().lower() if not cleaned_input: raise ValueError("global segment size cannot be empty.") UNIT_MULTIPLIERS = { - 'gb': 1024**3, # 1 GB = 1024^3 bytes - 'mb': 1024**2, # 1 MB = 1024^2 bytes + 'gb': 1024 ** 3, # 1 GB = 1024^3 bytes + 'mb': 1024 ** 2, # 1 MB = 1024^2 bytes 'kb': 1024, # 1 KB = 1024 bytes - 'b': 1 # 1 B = 1 byte + 'b': 1 # 1 B = 1 byte } - # Check for unit suffixes - for unit, multiplier in UNIT_MULTIPLIERS.items(): - if cleaned_input.endswith(unit): - number_part = cleaned_input[:-len(unit)].strip() - if not number_part: - raise ValueError( - f"Missing numeric value before unit '{unit}' in: '{value}'" - ) - return _convert_to_bytes(number_part, multiplier, value) - # Handle unit-less input (bytes) - return _convert_to_bytes(cleaned_input, 1, value) - - -def _convert_to_bytes(number_str: str, multiplier: int, - original_input: str) -> int: + pattern = r'^\s*([\d.]+)\s*(gb|mb|kb|b)?\s*$' + match = re.match(pattern, cleaned_input) + + if not match: + raise ValueError(f"Invalid format: '{value}'") + + number_str = match.group(1) + unit = match.group(2) or 'b' + + multiplier = UNIT_MULTIPLIERS[unit] + return _convert_to_bytes(number_str, multiplier, value) + + +def _convert_to_bytes(number_str: str, multiplier: int, original_input: str) -> int: """ Convert numeric string to byte count From 7eaf89f959d139f911f5282ae12947a2c91c76fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AD=90=E7=90=A6?= Date: Mon, 27 Oct 2025 11:25:05 +0800 Subject: [PATCH 5/8] fix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 李子琦 --- vllm_ascend/distributed/mooncake/config_data.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/vllm_ascend/distributed/mooncake/config_data.py b/vllm_ascend/distributed/mooncake/config_data.py index 216651c109f..4aac4d8584b 100644 --- a/vllm_ascend/distributed/mooncake/config_data.py +++ b/vllm_ascend/distributed/mooncake/config_data.py @@ -485,10 +485,10 @@ def _parse_global_segment_size(value) -> int: raise ValueError("global segment size cannot be empty.") UNIT_MULTIPLIERS = { - 'gb': 1024 ** 3, # 1 GB = 1024^3 bytes - 'mb': 1024 ** 2, # 1 MB = 1024^2 bytes + 'gb': 1024**3, # 1 GB = 1024^3 bytes + 'mb': 1024**2, # 1 MB = 1024^2 bytes 'kb': 1024, # 1 KB = 1024 bytes - 'b': 1 # 1 B = 1 byte + 'b': 1 # 1 B = 1 byte } pattern = r'^\s*([\d.]+)\s*(gb|mb|kb|b)?\s*$' match = re.match(pattern, cleaned_input) @@ -503,7 +503,8 @@ def _parse_global_segment_size(value) -> int: return _convert_to_bytes(number_str, multiplier, value) -def _convert_to_bytes(number_str: str, multiplier: int, original_input: str) -> int: +def _convert_to_bytes(number_str: str, multiplier: int, + original_input: str) -> int: """ Convert numeric string to byte count From 0d4ffe631ef914c0cdaa7f3b933c197f51c4c91a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AD=90=E7=90=A6?= Date: Mon, 27 Oct 2025 14:24:15 +0800 Subject: [PATCH 6/8] fix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 李子琦 --- tests/ut/distributed/mooncake/test_config_data.py | 2 ++ vllm_ascend/distributed/mooncake/config_data.py | 1 + 2 files changed, 3 insertions(+) diff --git a/tests/ut/distributed/mooncake/test_config_data.py b/tests/ut/distributed/mooncake/test_config_data.py index 3a6b425eb23..1d823e7d012 100644 --- a/tests/ut/distributed/mooncake/test_config_data.py +++ b/tests/ut/distributed/mooncake/test_config_data.py @@ -5,6 +5,7 @@ class TestParseGlobalSegmentSize(unittest.TestCase): + def test_int_input(self): self.assertEqual(_parse_global_segment_size(1024), 1024) self.assertEqual(_parse_global_segment_size(0), 0) @@ -52,6 +53,7 @@ def test_non_string_non_int_input(self): class TestConvertToBytes(unittest.TestCase): + def test_valid_conversion(self): self.assertEqual(_convert_to_bytes("10", 1, "10"), 10) self.assertEqual(_convert_to_bytes("1.5", 1024, "1.5KB"), diff --git a/vllm_ascend/distributed/mooncake/config_data.py b/vllm_ascend/distributed/mooncake/config_data.py index 4aac4d8584b..79b3011b088 100644 --- a/vllm_ascend/distributed/mooncake/config_data.py +++ b/vllm_ascend/distributed/mooncake/config_data.py @@ -15,6 +15,7 @@ DEFAULT_GLOBAL_SEGMENT_SIZE = 3355443200 # 3.125 GiB DEFAULT_LOCAL_BUFFER_SIZE = 1073741824 # 1.0 GiB + @dataclass class MooncakeEngineMetadata: """name of the LLM model""" From a5327d479476e67165e8d3729a691aa850e61f69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AD=90=E7=90=A6?= Date: Tue, 28 Oct 2025 09:43:21 +0800 Subject: [PATCH 7/8] fix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 李子琦 --- .../distributed/mooncake/test_config_data.py | 19 +++++++++---------- .../distributed/mooncake/config_data.py | 8 ++++---- 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/tests/ut/distributed/mooncake/test_config_data.py b/tests/ut/distributed/mooncake/test_config_data.py index 1d823e7d012..4408b41a825 100644 --- a/tests/ut/distributed/mooncake/test_config_data.py +++ b/tests/ut/distributed/mooncake/test_config_data.py @@ -9,25 +9,25 @@ class TestParseGlobalSegmentSize(unittest.TestCase): def test_int_input(self): self.assertEqual(_parse_global_segment_size(1024), 1024) self.assertEqual(_parse_global_segment_size(0), 0) - + def test_gb_unit(self): self.assertEqual(_parse_global_segment_size("2GB"), 2 * 1024**3) self.assertEqual(_parse_global_segment_size("1.5GB"), int(1.5 * 1024**3)) self.assertEqual(_parse_global_segment_size(" 2 GB "), 2 * 1024**3) - + def test_gb_unit_edge_cases(self): with self.assertRaises(ValueError): _parse_global_segment_size("GB") with self.assertRaises(ValueError): _parse_global_segment_size("abcGB") - + def test_mb_unit(self): self.assertEqual(_parse_global_segment_size("512MB"), 512 * 1024**2) self.assertEqual(_parse_global_segment_size("0.5MB"), int(0.5 * 1024**2)) self.assertEqual(_parse_global_segment_size("1024MB"), 1024 * 1024**2) - + def test_kb_unit(self): self.assertEqual(_parse_global_segment_size("256KB"), 256 * 1024) self.assertEqual(_parse_global_segment_size("1.25KB"), @@ -36,7 +36,7 @@ def test_kb_unit(self): def test_b_unit(self): self.assertEqual(_parse_global_segment_size("4096B"), 4096) self.assertEqual(_parse_global_segment_size("1024b"), 1024) - + def test_no_unit(self): self.assertEqual(_parse_global_segment_size("2048"), 2048) self.assertEqual(_parse_global_segment_size("0"), 0) @@ -44,16 +44,16 @@ def test_no_unit(self): def test_non_string_non_int_input(self): self.assertEqual(_parse_global_segment_size(2048.0), 2048) self.assertEqual(_parse_global_segment_size(True), 1) - + with self.assertRaises(TypeError): _parse_global_segment_size(None) - + with self.assertRaises(TypeError): _parse_global_segment_size({"size": 1024}) class TestConvertToBytes(unittest.TestCase): - + def test_valid_conversion(self): self.assertEqual(_convert_to_bytes("10", 1, "10"), 10) self.assertEqual(_convert_to_bytes("1.5", 1024, "1.5KB"), @@ -63,7 +63,6 @@ def test_valid_conversion(self): def test_invalid_numbers(self): with self.assertRaises(ValueError): _convert_to_bytes("abc", 1, "abc") - + with self.assertRaises(ValueError): _convert_to_bytes("1.2.3", 1024, "1.2.3KB") - diff --git a/vllm_ascend/distributed/mooncake/config_data.py b/vllm_ascend/distributed/mooncake/config_data.py index 79b3011b088..36c820b0890 100644 --- a/vllm_ascend/distributed/mooncake/config_data.py +++ b/vllm_ascend/distributed/mooncake/config_data.py @@ -480,7 +480,7 @@ def _parse_global_segment_size(value) -> int: raise TypeError( f"Unsupported type for global_segment_size: {type(value)}" ) from e - + cleaned_input = value.strip().lower() if not cleaned_input: raise ValueError("global segment size cannot be empty.") @@ -493,13 +493,13 @@ def _parse_global_segment_size(value) -> int: } pattern = r'^\s*([\d.]+)\s*(gb|mb|kb|b)?\s*$' match = re.match(pattern, cleaned_input) - + if not match: raise ValueError(f"Invalid format: '{value}'") - + number_str = match.group(1) unit = match.group(2) or 'b' - + multiplier = UNIT_MULTIPLIERS[unit] return _convert_to_bytes(number_str, multiplier, value) From 01cc380a8a787f8e87a5507988b43c46b2454f80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AD=90=E7=90=A6?= Date: Thu, 6 Nov 2025 09:43:08 +0800 Subject: [PATCH 8/8] B Conflict resolution MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 李子琦 --- docs/source/user_guide/feature_guide/kv_pool_mooncake.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/user_guide/feature_guide/kv_pool_mooncake.md b/docs/source/user_guide/feature_guide/kv_pool_mooncake.md index 8134caf4aab..34ab0479079 100644 --- a/docs/source/user_guide/feature_guide/kv_pool_mooncake.md +++ b/docs/source/user_guide/feature_guide/kv_pool_mooncake.md @@ -5,7 +5,7 @@ * Software: * Python >= 3.9, < 3.12 * CANN >= 8.3.rc1 - * PyTorch == 2.7.1, torch-npu == 2.7.1 + * PyTorch >= 2.7.1, torch-npu >= 2.7.1.dev20250724 * vLLM:main branch * vLLM-Ascend:main branch * Mooncake:main branch