DistributedScenarioFilter의 get_scenarios 메서드는 분산 처리 설정에 따라 다음과 같이 동작합니다:
단일 노드 / SINGLE_NODE 모드:
설정에 따라 전체 시나리오를 단순히 추출하여 반환LOG_FILE_BASED 모드:
SCENARIO_BASED 모드:
이 과정은 분산 환경에서 전체 시나리오 작업 부하를 균등하게 나누고, 각 노드가 올바른 데이터만 처리할 수 있도록 보장합니다.
분산 작업 분할:
여러 노드(또는 머신)가 동시에 시뮬레이션을 실행할 때, 전체 시나리오 목록을 각 노드에 균등하게 나누어 할당합니다.
동기화:
S3 또는 로컬 파일 시스템 지원:
분산 환경이 S3와 같은 클라우드 스토리지를 사용하는 경우와 로컬 파일 시스템을 사용하는 경우 모두를 지원합니다.
예를 들어, CSV 파일을 읽어 전체 시나리오 토큰(token)과 로그 파일 정보를 수집합니다.
build_scenario_builder(cfg)와 build_scenario_filter(cfg.scenario_filter) 함수를 호출하여, 설정(cfg)에 정의된 모든 시나리오를 한 번에 추출합니다. scenario_builder.get_scenarios(scenario_filter, self._worker)를 호출하여 필터에 맞는 시나리오들을 가져옵니다._get_log_db_files_for_single_node()를 호출하여 현재 노드에 할당된 로그 DB 파일 목록(시나리오의 원천 데이터 청크)을 얻습니다._get_scenarios_from_list_of_log_files(current_chunk)를 통해, 해당 로그 파일들에서 시나리오들을 추출합니다._get_log_db_files_for_single_node()를 호출하여 현재 노드의 로그 파일 청크를 가져온 후, _get_scenarios_from_list_of_log_files(current_chunk)를 통해 시나리오들을 추출합니다._get_repartition_tokens(scenarios)를 호출하여, 현재 노드에서 추출한 시나리오들의 토큰(token)과 해당 로그 파일 정보를 다른 노드들과 동기화합니다. scenario_filter.scenario_tokens와 scenario_builder.db_files를 새로 업데이트하여, 재분배된 토큰과 DB 파일 목록을 반영합니다.build_scenario_builder(cfg)와 build_scenario_filter(cfg.scenario_filter)를 호출하여, 재분배된 조건에 맞게 시나리오 빌더와 필터를 새로 생성합니다._get_log_db_files_for_single_node():
현재 노드에 할당된 로그 DB 파일 목록을 결정합니다.
단일 노드이면 설정에서 그대로 가져오고, 다중 노드인 경우 S3에서 모든 로그 파일 목록을 청크(chunk)로 나눠 해당 청크를 반환합니다.
_write_token_csv_file() & _get_all_generated_csv():
각 노드가 처리한 시나리오의 토큰과 로그 파일 이름을 CSV 파일로 저장한 후, 모든 노드의 CSV 파일을 모아 전체 토큰 목록을 구성합니다.
_get_token_and_log_chunk_on_single_node():
전체 토큰 목록을 여러 노드로 균등하게 분할하고, 현재 노드에 해당하는 토큰과 관련 로그 파일 목록을 결정합니다.
_get_scenarios_from_list_of_log_files():
지정된 로그 파일 목록을 기반으로 시나리오 빌더와 필터를 사용하여 시나리오들을 추출합니다.
주석에 나온 예시 설정(cfg.scenario_builder)은 다음과 같이 구성되어 있습니다:
vehicle_parameters:
_target_: 'nuplan.common.actor_state.vehicle_parameters.VehicleParameters' scenario_mapping:
_target_: 'nuplan.planning.scenario_builder.nuplan_db.nuplan_scenario_utils.ScenarioMapping' 기타 경로 설정:
data_root, map_root, sensor_root 등이 설정되어 있어, 실제 데이터, 지도, 센서 블롭이 저장된 위치를 지정db_files는 (보통 나중에 주입되거나 동적으로 설정되지만) 여기서는 None으로 설정되어 있습니다.map_version, include_cameras, max_workers, verbose 등의 옵션도 포함되어 있습니다.target 필드:
_target_ 값으로 'nuplan.planning.scenario_builder.nuplan_db.nuplan_scenario_builder.NuPlanScenarioBuilder'가 지정되어 있습니다.convert 필드:
_convert_: 'all'은 DictConfig 내 모든 값들을 필요한 타입으로 변환하도록 지정합니다.Hydra 설정 해석 및 인스턴스 생성:
VehicleParameters 주입:
'vehicle_parameters' 부분을 통해, Pacifica 차량에 대한 물리적 특성(너비, 전/후면 길이, 휠베이스 등)이 설정되고,ScenarioMapping 주입:
'scenario_mapping' 부분을 통해, 다양한 시나리오 유형에 대한 추출 지침(예: 지속시간 15초, 시작 오프셋 -3초, 샘플링 비율 0.5)이 제공됩니다.기타 설정:
data_root는 ./data/nuplan-v1.1/test/로 설정되어 있어, 여기서 로그 데이터(DB 파일 등)를 찾습니다.width, front_length, rear_length, wheel_base 등 차량의 치수를 설정합니다.cog_position_from_rear_axle (후륜에서 중심까지의 거리)와 height 등도 포함되어 있습니다.half_width, half_length 프로퍼티를 통해 차량의 절반 크기를 쉽게 계산할 수 있습니다.subsample_ratio_override 값을 기본으로 사용합니다.시나리오 토큰 검증:
scenario_tokens 항목이 존재할 경우, 이 리스트의 모든 토큰이 올바른 형식(예: 16자리 문자열)인지 is_valid_token 함수를 통해 확인합니다. 인스턴스 생성:
instantiate 함수를 사용해 cfg에 정의된 내용을 바탕으로 ScenarioFilter 객체를 생성합니다. 타입 검증:
validate_type 함수를 통해 확인합니다.로그 및 반환:
위 YAML 설정을 통해 instantiate(cfg)를 호출하면, 다음과 같은 ScenarioFilter 인스턴스가 만들어집니다:
시나리오 유형: 지정된 14개 유형(예: 'starting_left_turn', 'changing_lane' 등)만 포함
시나리오 토큰, 로그, 지도 제한: 따로 지정하지 않으므로 모든 데이터를 사용
각 유형당 최대 시나리오 수: 20개
타임스탬프 기준: 시나리오 초기 타임스탬프 간 최대 15초의 차이를 기준으로 필터링
나머지 속성: 불필요한 경우 제거(예: invalid goals는 제거됨)하며, 최종 시나리오 목록은 섞이지 않습니다.
이 ScenarioFilter 객체는 nuPlan 시나리오 빌더가 데이터베이스에서 시나리오를 추출할 때, 위 조건들을 적용하여 적합한 시나리오만 선택하도록 돕습니다.
scenario_types
[
'starting_left_turn', 'starting_right_turn', 'starting_straight_traffic_light_intersection_traversal',
'stopping_with_lead', 'high_lateral_acceleration', 'high_magnitude_speed', 'low_magnitude_speed',
'traversing_pickup_dropoff', 'waiting_for_pedestrian_to_cross', 'behind_long_vehicle',
'stationary_in_traffic', 'near_multiple_vehicles', 'changing_lane', 'following_lane_with_lead'
]scenario_tokens
Nonelog_names
Nonemap_names
Nonenum_scenarios_per_type
20limit_total_scenarios
Nonetimestamp_threshold_s
15ego_displacement_minimum_m
Noneego_start_speed_threshold, ego_stop_speed_threshold, speed_noise_tolerance
Noneexpand_scenarios
Falseremove_invalid_goals
Trueshuffle
False시나리오 필터링:
데이터 전처리:
설정 검증:
__post_init__ 메서드를 통해, 설정된 값들이 올바른 범위(예: num_scenarios_per_type가 양수, limit_total_scenarios가 올바른 범위 내에 있음)인지 확인하여 잘못된 설정으로 인한 오류를 사전에 방지합니다.