optimum/neuron/utils/system.py (46 lines of code) (raw):
# coding=utf-8
# Copyright 2025 The HuggingFace Inc. team. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import functools
import logging
import os
import re
NEURON_DEV_PATTERN = re.compile(r"^neuron\d+$", re.IGNORECASE)
MAJORS_FILE = "/proc/devices"
NEURON_MAJOR_LINE = re.compile(r"^\s*(\d+)\s+neuron\s*$")
logger = logging.getLogger(__name__)
# Note: with python 3.9, functools.cache would be more suited
@functools.lru_cache()
def get_neuron_major() -> int:
with open(MAJORS_FILE, "r") as f:
for l in f.readlines():
m = NEURON_MAJOR_LINE.match(l)
if m:
return int(m.group(1))
logger.error("No major for neuron device could be found in /proc/devices!")
return -1
def get_available_cores() -> int:
"""A helper to get the number of available cores.
This number depends first on the actual number of cores, then on the
content of the NEURON_RT_NUM_CORES and NEURON_RT_VISIBLE_CORES variables.
"""
device_count = 0
neuron_major = get_neuron_major()
root, _, files = next(os.walk("/dev"))
# Just look for devices in dev, non recursively
for f in files:
if neuron_major > 0:
try:
dev_major = os.major(os.stat("{}/{}".format(root, f)).st_rdev)
if dev_major == neuron_major:
device_count += 1
except FileNotFoundError:
# Just to avoid race conditions where some devices would be deleted while running this
pass
else:
# We were not able to get the neuron major properly we fallback on counting neuron devices based on the
# device name
if NEURON_DEV_PATTERN.match(f):
device_count += 1
max_cores = device_count * 2
num_cores = os.environ.get("NEURON_RT_NUM_CORES", max_cores)
if num_cores != max_cores:
num_cores = int(num_cores)
num_cores = min(num_cores, max_cores)
visible_cores = os.environ.get("NEURON_RT_VISIBLE_CORES", num_cores)
if visible_cores != num_cores:
# Assume NEURON_RT_VISIBLE_CORES is in the form '4' or '7-15'
if "-" in visible_cores:
start, end = visible_cores.split("-")
visible_cores = int(end) - int(start) + 1
else:
visible_cores = 1
visible_cores = min(visible_cores, num_cores)
return visible_cores