Files
2026-07-13 12:24:33 +08:00

133 lines
3.8 KiB
Python

# SPDX-License-Identifier: Apache-2.0
# Standard
import argparse
import os
# Third Party
import pytest
import torch
import yaml
try:
# Third Party
import eic
EIC_AVAILABLE = True
except ImportError:
EIC_AVAILABLE = False
pytestmark = pytest.mark.skipif(not EIC_AVAILABLE, reason="eic module not available")
def parse_args():
parser = argparse.ArgumentParser(description="EIC Storage Unit Test")
parser.add_argument(
"--config",
"-c",
type=str,
default="/workspace/config/remote-eic.yaml",
help="EIC yaml config",
)
args, _ = parser.parse_known_args()
return args
def init_eic_client():
args = parse_args()
config_path = os.path.abspath(args.config)
if not os.path.exists(config_path):
raise FileNotFoundError(f"Config file not found: {config_path}")
with open(config_path, "r") as fin:
config = yaml.safe_load(fin)
remote_url = config.get("remote_url", None)
if remote_url is None:
raise AssertionError("remote_url is None")
endpoint = remote_url[len("eic://") :]
eic_instance_id = config.get("eic_instance_id", None)
eic_log_dir = config.get("eic_log_dir", None)
eic_log_level = config.get("eic_log_level", 2)
eic_trans_type = config.get("eic_trans_type", 3)
eic_flag_file = config.get("eic_flag_file", None)
if not os.path.exists(eic_log_dir):
os.makedirs(eic_log_dir, exist_ok=True)
eic_client = eic.Client()
init_option = eic.InitOption()
init_option.log_dir = eic_log_dir
init_option.log_level = eic.LogLevel(eic_log_level)
init_option.transport_type = eic.TransportType(eic_trans_type)
init_option.flag_file = eic_flag_file
ret = eic_client.init(eic_instance_id, endpoint, init_option)
if ret != 0:
raise RuntimeError(f"EIC Client init failed with error code: {ret}")
return eic_client
def test_set(eic_client):
test_key = ["test_key_" + str(i) for i in range(16)]
tensors = [
torch.ones([12, 6, 1, 512], dtype=torch.bfloat16, device="cpu")
for _ in range(16)
]
data_keys = eic.StringVector()
data_vals = eic.IOBuffers()
for i in range(16):
data_keys.append(test_key[i])
data_vals.append(
tensors[i].data_ptr(),
tensors[i].numel() * tensors[i].element_size(),
False,
)
set_opt = eic.SetOption()
set_opt.ttl_second = 3
status_code, set_outcome = eic_client.mset(data_keys, data_vals, set_opt)
assert status_code == eic.StatusCode.SUCCESS, (
f"Set failed with status code: {status_code}"
)
def test_get(eic_client):
test_key = ["test_key_" + str(i) for i in range(16)]
tensors = [
torch.zeros([12, 6, 1, 512], dtype=torch.bfloat16, device="cpu")
for _ in range(16)
]
data_keys = eic.StringVector()
data_vals = eic.IOBuffers()
for i in range(16):
data_keys.append(test_key[i])
data_vals.append(
tensors[i].data_ptr(),
tensors[i].numel() * tensors[i].element_size(),
False,
)
get_opt = eic.GetOption()
status_code, data_vals, get_outcome = eic_client.mget(data_keys, get_opt, data_vals)
assert status_code == eic.StatusCode.SUCCESS, (
f"Get failed with status code: {status_code}"
)
def test_exists(eic_client):
test_key = ["test_key_" + str(i) for i in range(16)]
data_keys = eic.StringVector()
for key in test_key:
data_keys.append(key)
exists_opt = eic.ExistOption()
status_code, exists_outcome = eic_client.mexist(data_keys, exists_opt)
assert status_code == eic.StatusCode.SUCCESS, (
f"Exists failed with status code: {status_code}"
)
def main():
eic_client = init_eic_client()
test_set(eic_client)
test_exists(eic_client)
test_get(eic_client)
if __name__ == "__main__":
main()