- 읽은 자료 4건
- 정본 반영 2개 파일(services/x.md, radar.md)
- 레이더 3건
- Meta와 Netflix는 신규 자료 없음
오늘 함께 본 다른 변화는 다음과 같다.
- X는 같은 커밋에서 광고 브랜드 안전 판정에 HighRisk 단계를 더하고, 정책 위반 판정의 Grok 심판을 세 카테고리로 넓혔다.
- arXiv cs.IR triage에서는 3건이 레이더를 통과했다. VK HEGM, Ant Densing Law, Spotify의 추론 트레이스 실험이다.
- Spotify 실험에서는 추론 트레이스가 offline 추천 성능을 최대 19%까지 떨어뜨렸다.
1노출 판정 재작성을 프로덕션 트래픽으로 검증하는 장치가 완성됐다 — X
자료 xai-org/x-algorithm@d011592 — xai-org 공개 저장소, 2026-08-24T18:51:34Z 커밋, 코드. 이 노트들은 4세대 공개 뒤의 X 커밋에 차례로 번호를 붙여 부르며, 이 커밋은 4세대+7이다. 변경 규모는 파일 19, +1,418/−117이다. 커밋 메시지는 이 시리즈의 관행대로 "Open-source X Recommendation Algorithm" 한 줄뿐이라, 내용은 파일 diff로만 판독했다. 8월 25일(화) 01:00 KST 배치가 08-24 18:51 UTC 커밋을 놓쳤고 24일 daily도 "신규 없음"으로 판정해서, 26일 배치가 뒤늦게 따라잡는다.
배경 X For You 타임라인의 4세대 오픈소스 릴리스에는 2026-08-13 최초 공개(47c1bcd, +363,246/−11,640) 뒤로 매일 또는 격일로 후속 커밋이 붙고 있다. 이번 커밋(4세대+7, d011592)이 손댄 곳은 크게 세 갈래다.
- VF(visibility-filtering)는 포스트마다 이 뷰어에게 보여도 되는지를 판정하는 안전 필터 스택이다. 4세대 최초 공개에서 전부 공개됐다.
- home-mixer(For You 피드를 조립하는 서비스)의 브랜드 안전 판정은 광고 인접성 게이팅을 맡는다.
- PTOS(정책 기반 위반 카테고리 판정) 파이프라인은 Grok LLM으로 위반 카테고리를 재분류한다. 이 파이프라인은 grox(Grok 기반 nearline 분류기)에 있다.
세 갈래는 서로 다른 방향으로 성숙하고 있는데, 이번 커밋에서 나란히 진화했다. 이번 커밋에는 Phoenix(X For You의 랭킹 모델)의 체크포인트 로더 변경과 grox의 작은 변경 3건도 함께 들어 있다.
1-1. staging VF가 요청마다 레퍼런스 VF와 판정을 대조하고, 다를 때만 기록한다
VF 재작성을 프로덕션 트래픽으로 검증하는 스택이 이번 커밋으로 3단이 됐다 확인. staging에 배포된 VF가 요청마다 레퍼런스 VF를 함께 불러 판정을 엄격하게 비교하고, 결과가 다른 경우만 남긴다.
VF는 4세대 최초 공개에서 소스 전체가 처음으로 공개된 서브레포다. 이전 세대인 1·2세대 Scala VF와 함께 돌아가면서 재작성이 진행 중이다. 그런데 VF는 정본 주의 목록 1번에 적은 fail-closed 구조라서, 정책을 바꿀 때 감수할 위험이 크다. 판정이 없는 결과를 모두 drop으로 처리하기 때문이다. 이 위험에 대응하는 인프라가 세 단계로 갖춰졌다. 이제 dark_traffic이 흘려보낸 프로덕션 트래픽이 staging VF에 도착하면, staging VF는 자기 verdict를 계산하면서 동시에 이전 세대인 Strato 기반 레퍼런스와 대조한다.
새로 알게 된 것A. 트래픽 미러링, staging 검증, 판정 대조의 3단 검증 스택이 완성됐다
- VF 검증 스택이 3단으로 완성됐다 확인. dark_traffic이 트래픽만 흘려보내는 단계, dark_traffic 타깃을 staging으로 바꿔 프로덕션 트래픽으로 staging을 검증하는 단계, reference_compare가 staging 안에서 verdict를 대조하는 단계로 이어진다.
- 1단, 4세대+4 (aad7179, 2026-08-19):
dark_traffic_setup.rs(109줄 신규)가 프로덕션 트래픽 요청을xai-vf-shadow.prod.visibility로 병렬 미러링한다. 이 단계에서는 트래픽 자원만 소비한다. - 2단, 4세대+6 (28e414f, 2026-08-21): dark_traffic 타깃의 이름이
xai-vf-service.staging.visibility:grpc로 바뀌었다. shadow prod가 아니라 staging 배포를 프로덕션 트래픽으로 검증하겠다는 뜻이다. - 3단, 4세대+7 (d011592, 2026-08-24):
reference_compare.rs(812줄 신규)가 staging 배포 안에서 요청마다 Strato(X 코드가 데이터를 조회하거나 저장할 때 거치는 내부 시스템) 기반 레퍼런스 VF를 병렬로 호출한다. verdict를 엄격하게 비교한 다음, 결과가 다른 경우만 JSON 라인으로 로깅한다. - 새 파일의 전체 경로는
visibility-filtering/reference_compare.rs(812줄)이고, 레퍼런스 쪽 클라이언트는StratoVfClient다. - 정책을 바꿀 때 위험이 큰 fail-closed 안전 서브레포를 프로덕션 트래픽 규모로 회귀 감사할 수 있게 됐고, VF 변경을 적용할 때의 위험이 크게 줄었다.
- 1단, 4세대+4 (aad7179, 2026-08-19):
새로 알게 된 것B. 대조는 응답 경로 밖에서 돌고, 레퍼런스 VF와 판정이 완전히 일치하는지 엄격하게 비교한다
- main path는 자기 verdict를 harness task에 넘기기만 하므로, 대조 작업은 응답에 영향을 주지 않는다(read-only).
begin_compare(viewer_id, country_code, safety_level, tweet_ids)가 별도의 tokio task를 spawn하고, main path는 verdict를oneshot::channel로 넘긴다.- 타임아웃은 1.5초다.
- 비교는 정규화를 거치지 않고, action 라벨과 FilteredReason이 완전히 일치하는지 엄격하게 본다.
- 비교 함수는
is_exact_match(&VfAction, &Option<FilteredReason>)다.
- 비교 함수는
StratoVfClient가 레퍼런스 VF의 정체다 추정.StratoVfClient가 감싸는 실제 VF 스택이 1·2세대 Scala VF의 잔재인지, 별도의 참조 구현인지는 코드에 명시되어 있지 않다.client_id = "visibility-filtering-service.{APP_ENV}"형식으로 자신을 식별하는 것을 보면, 별도의 인스턴스가 돌고 있다고 보인다 추정.
새로 알게 된 것C. 판정 차이를 조합별로 묶어 기록하므로, 많은 tweet이 같은 방식으로 어긋나도 로그가 폭증하지 않는다
- diff를 조합별로 묶어 최적화했다 확인. 같은 (service, reference) 조합끼리 tweet_id를 묶어 로그 라인 하나에 담고, 12KiB 예산을 넘으면 균등하게 나눈다.
- 즉 로그 라인 개수는 diff 조합의 수에 비례하고 tweet_id 개수에는 비례하지 않으므로, 많은 tweet이 같은 방식으로 divergent해도 로그가 폭증하지 않는다.
- diff 로깅은 같은 (service_verdict, reference_verdict) 조합끼리 tweet_id를 묶고, 12KiB 라인 예산에 맞춰 청킹한 다음 stdout에 내보낸다.
출력은
println!("{line}")이고, 각 라인의 형식은 다음과 같다.{"h":"vf_reference_compare","v":1,"batch":"...","chunk":[1,1],"build":"<12자 SHA>","dc":"atla","level":"TimelineHome","viewer":<u64>,"diffs":[["drop:AuthorIsSuspended","allow",[123, 456]], ...]}
새로 알게 된 것D. prod 환경에서 하니스를 켜면 부팅이 실패한다
부팅 시점에 staging 전용임을 강제한다. 플래그가 켜져 있는데 환경이 prod이면 Err를 돌려준다.
pub(crate) fn should_build_harness( flag_enabled: bool, app_env: Option<&str>, ) -> Result<bool, &'static str> { match (flag_enabled, app_env) { (false, _) => Ok(false), (true, Some("prod")) => Err( "VF_DUAL_CALL_HARNESS_ENABLED is set but APP_ENV=prod; the reference comparator is staging-only", ), (true, _) => Ok(true), } }이 Err는 부팅 실패로 이어진다. staging 전용이라는 제약을 코드 수준에서 강제해, production에서 dual-call이 실수로 켜지는 사고를 막는다.
server_deps.rs의build_reference_compare_harness()가 Err를panic!()으로 승격시킨다.
새로 알게 된 것그 밖의 변경
- 메트릭 6종이 노출된다. 모든 메트릭에 빌드 SHA 라벨이 붙기 때문에, 특정 빌드에서 diff 비율이 튀면 어느 배포가 원인인지 즉시 추적할 수 있다.
vf_reference_compared_exact_match_differed_error(kind=timeout|reference_item|missing_result)_skipped(reason=level_unmapped|logged_out_viewer)_enabled- 노출 경로는
xai_stats_receiver::global_stats_receiver()이고, 라벨 이름은build_sha다.
"the reference comparator is staging-only" —
reference_compare.rs:31-33
정본 반영 services/x.md의 세 절에 반영했다.
- 4세대 표에 +7 행을 추가했다. 파일 목록과 +1,418/−117 규모, 핵심 8건을 요약했다.
- 한 줄 요약 문단을 확장했다. 4세대+7 커밋에 대한 서술을 추가했다.
- 안전성 절에 새 소절 "4세대+7 (2026-08-24) — VF 레퍼런스 비교 하니스 (
reference_compare.rs) 배선"을 추가했다. 동작과 게이팅, 의미를 상세히 적었다.
1-2. 광고 브랜드 안전 판정에 가장 높은 HighRisk 단계가 생겼다
브랜드 안전 판정이 3단계(Safe/LowRisk/MediumRisk)에서 HighRisk를 더한 4단계로 확장됐다. 이전에는 medium risk에 묶여 있던 라벨 5종이 HighRisk로 올라갔고, 새 라벨 1종이 추가됐다.
새로 알게 된 것E. 라벨 6종이 HighRisk로 묶였고, HighRisk를 가장 먼저 검사한다
HighRisk로 승격되거나 새로 만들어진 라벨은 6종이다 확인.
파일은
home-mixer/models/brand_safety.rs이고, 새 등급은BrandSafetyVerdict::HighRisk = 4다.pub(crate) const HIGH_RISK_LABELS: &[SafetyLabelType] = &[ SafetyLabelType::NSFW_HIGH_PRECISION, // medium에서 승격 SafetyLabelType::NSFW_HIGH_RECALL, // medium에서 승격 SafetyLabelType::GORE_AND_VIOLENCE_HIGH_PRECISION, // medium에서 승격 SafetyLabelType::PDNA, // medium에서 승격 (Photo DNA — 아동 성착취 이미지 해시) SafetyLabelType::EGREGIOUS_NSFW, // medium에서 승격 SafetyLabelType::SOFT_NSFW, // 신규 ];
두 판정 함수 모두 HighRisk 검사를 캐스케이드의 맨 위로 옮겼다. 가장 나쁜 판정을 고르는 비교가 그대로 확장되므로, 이제 HighRisk가 최상위 등급이다.
- 두 함수는
compute_verdict()와compute_verdict_v2()다.worst_verdict()의>= 비교가 자동으로 확장된다.
- 두 함수는
새로 알게 된 것F. HighRisk도 광고 회피 대상이지만, 아직 MediumRisk와 명시적으로 다른 조치는 없다
광고 유틸의 회피 판정도 확장돼, 이제 HighRisk도 avoid 대상이 된다.
이전에는
MediumRisk만 대상이었다.함수는
has_avoid()다.pub(crate) fn has_avoid(post: &ScoredPost) -> bool { matches!( post.brand_safety_verdict(), BrandSafetyVerdict::MediumRisk | BrandSafetyVerdict::HighRisk ) }
인용 인접성 escalation도 함께 승격됐다. NSFW author가 쓴 조상 포스트를 인용한 경우, verdict를
MediumRisk에서HighRisk로 escalate한다.- 파일은
ads_brand_safety_vf_hydrator.rs다.
- 파일은
즉 인접성 판정에서 HighRisk는 MediumRisk와 똑같이 회피 대상이고, 아직 추가 조치가 명시적으로 다르지는 않다. 강도를 따로 구분한 것은 실험을 진행하고 다운스트림에서 추적하려는 목적으로 보인다.
새로 알게 된 것G. V2 라벨 5종이 feed 응답에 실려 나가기 시작했다
- V2 라벨 5종이 proto로 노출되기 시작했다 확인. 이전에는 V2 라벨을 home-mixer 내부 판정에만 썼고, 다운스트림 소비자(feed 응답을 받는 다른 서비스와 클라이언트)에게는 감춰 두었다. 이제는 실제로 응답에 실려 나간다.
scored_posts_server.rs의safety_label_to_protomapping에 다섯 개가 새로 들어갔다.GROK_SFA_V2→HM::GrokSfaV2GROK_NSFA_LIMITED_V2→HM::GrokNsfaLimitedV2GROK_NSFA_V2→HM::GrokNsfaV2GROK_NSFA_EXPANDED_V2→HM::GrokNsfaExpandedV2PTOS_REVIEWED→HM::PtosReviewed
새로 알게 된 것H. V2 판정 실험의 버킷이 광고 로그에 남기 시작했다
DDG experiment 트래킹도 함께 들어왔다 확인. 광고 삽입 로깅이 V2 판정 experiment의 버킷을 로깅에 노출한다.
experiment는
EnableAdsBrandSafetyVerdictV2이고, 파일은ads_injection_logging_side_effect.rs다.ddg_experiment_bucket: query .params .experiment_buckets(EnableAdsBrandSafetyVerdictV2) .first() .map(|b| format!("{}:{}", b.experiment, b.bucket)) .unwrap_or_default(),
DDG는 X의 광고 리포팅 파이프라인으로 추정한다 추정. Data Dashboard 또는 그와 유사한 계열의 시스템으로 보인다.
이 로깅 덕분에 V2 실험군의 매출과 안전 metric을 관측할 수 있게 됐다. V2 판정 로직이 아직 experiment 단계라는 방증이기도 하다.
V2 판정은 4세대+2(2026-08-17)에서 도입되고 +3에서 재설계됐다. 이번 +7에서 experiment 실측 인프라를 갖추면서, 8일에 걸친 과정이 마무리됐다.
"MEDIUM_RISK_LABELS_V2에서 위 5종 제거" —
home-mixer/models/brand_safety.rs
정본 반영 services/x.md 광고 절의 브랜드 안전 서술을 갱신하고, 그 뒤에 "4세대+7 HighRisk tier 신설" 소절을 추가했다.
1-3. PTOS 심판이 세 카테고리로 넓어지고, Grok 4.5가 심판 전용으로 돌아왔다
PTOS 심판 계층이 성인 컨텐츠 하나에서 세 카테고리(ChildSafety, ViolentMedia, IllegalAndRegulatedBehaviors)로 확장됐다. 그리고 3일 전 커밋(4세대+6)에서 완전히 제거됐던 Grok 4.5가 다른 엔드포인트를 통해 심판 전용으로 다시 들어왔다.
새로 알게 된 것I. Grok 4.5는 8일 사이에 제거됐다가, 다른 엔드포인트로 심판 자리에만 돌아왔다
- Grok 4.5는 4세대+2에서 성인 컨텐츠 심판으로 들어왔다가 4세대+6에서 완전히 제거됐다. 이번 커밋에서는 다른 엔드포인트를 통해 심판 자리에만 돌아왔다.
- 4세대+2 (2026-08-17):
EAPI_GROK_4_5_INTERNAL이 성인 컨텐츠 심판으로 도입됐다(SafetyPtosAdultContentCrossValidationJudge). - 4세대+4 (2026-08-19): Grok 4.6 internal을 10% dial로 도입했다(호출의 10%를 실제로 4.6이 판정한다).
- 4세대+5 (2026-08-20): 4.6 dial을 10%에서 30%로 올렸다.
- 4세대+6 (2026-08-21): 4.6 dial을 30%에서 100%로 올리면서 4.5 internal을 코드에서 완전히 제거했다. breaker와 sampler, dial 상수를 모두 삭제했다.
- 4세대+7 (2026-08-24):
EAPI_GROK_4_5_X_ALGO를 심판 전용으로 재도입했다. primary가 아니라 judge로만 쓴다.
- 4세대+2 (2026-08-17):
- X_ALGO라는 접미사는 x-algorithm 도메인에 맞춰 튜닝한 변형임을 시사한다 추정. 4.5 base에 x-algorithm 파인튜닝을 더한 것인지, 완전히 별개의 모델인지는 공개되지 않았다.
- 회로차단기 파라미터는 4.6 internal과 같다.
- 회로차단기는
_eapi_4_5_x_algo_breaker이고, window 600초, 회복 600초, half-open 5회다.
- 회로차단기는
새로 알게 된 것J. 새 교차 검증기는 세 카테고리 모두에서 판정을 낮추기만 한다
- 교차 검증기 클래스가 새로 생겼고, 세 카테고리를 각각의 전용 메서드로 보낸다.
- 클래스는
SafetyPtosPolicyCrossValidator이고, 파일은grox/flows/ptos/classifier.py다. - 진입점인
validate(category, post, policy)가 카테고리별로 라우팅한다.
- 클래스는
- 세 카테고리 모두 강등만 허용한다. cross-validator(
SafetyPtosPolicyCrossValidator)는 primary보다 엄격한 판정을 낼 수 없고, primary가 잘못 잡아낸 것을 심판이 풀어 주는 방향으로만 작동한다. 4세대+2에서 도입한 성인 컨텐츠 judge와 같은 설계 철학이다. - ChildSafety는 4.5로 다시 확인해서 policy type이 일치하면 판정을 유지하고, 일치하지 않으면
NoViolation으로 강등한다. 파싱에 실패하거나 에러가 나도NoViolation으로 fallback한다.- 메서드는
_validate_child_safety다. _build_policy_convo에 post creation date를 넣어child_safety_policy_prompt(post_creation_time)를 사용한다. 아동 안전 판정에는 시점에 따라 달라지는 요소가 있다는 뜻이다.
- 메서드는
- ViolentMedia는 강등 선택지가 3가지로 세분화됐다. 4.5로 다시 확인해서 일치하면 유지하고,
NoViolation이면 강등하며, type_mismatch면 더 약한 유형인ViolentMediaGraphicMedia로 downgrade한다.- 메서드는
_validate_violent_media다.
- 메서드는
- IllegalAndRegulatedBehaviors는 4.5로 다시 확인해서 일치하면 policy type은 유지하되, reason은 4.5가 내놓은 것으로 덮어쓴다(사유 설명이 더 정확해진다). 일치하지 않으면
NoViolation으로 강등한다.- 메서드는
_validate_illegal_and_regulated_behaviors다.
- 메서드는
- 세 카테고리마다 결과를 outcome 태그로 나눠 센다.
- 메트릭은
safety_ptos.<category>_cross_model_validate_with_grok_4_5카운터다. - 태그는
agreed/disagreed/unparseable/no_violation/type_mismatch/error다.
- 메트릭은
새로 알게 된 것K. 폭력 발언과 자살·자해 두 카테고리에서만 추론을 켜고, 부모 스레드가 있으면 함께 읽는다
- ViolentSpeech와 SuicideOrSelfHarm 두 카테고리에서만 reasoning을 켠다. 다른 카테고리는 여전히 사고를 억제해서 빠르고 저렴하게 응답한다.
- 설정은
USE_REASONING_CATEGORIES = {ViolentSpeech, SuicideOrSelfHarm}이다. - 이 두 카테고리에서만
SafetyPtosPolicyClassifier.build_convo()가_strip_thinking_restrictions를 프롬프트에 적용하고, assistant 메시지를 비워 두어 모델이 자유롭게 사고하도록 한다. - 다른 카테고리는
THINKING_CONTROL_END로 사고를 억제한다.
- 설정은
- 같은 두 카테고리에서만, post에 조상 포스트가 있으면 부모 스레드 전체를 사용자 메시지로 렌더한다.
- 설정은
USE_THREAD_RENDERER_CATEGORIES = {ViolentSpeech, SuicideOrSelfHarm}이다. post에ancestors가 있으면ThreadRenderer가 렌더한다.
- 설정은
- 이유는 근본적이다. "죽고 싶어" 같은 문장은 스레드 문맥 없이는 판정할 수 없다. 이전 발화가 게임에서 졌다는 이야기라면 무해하지만, 자해를 지지하는 스레드라면 위중하다.
- 폭력 발언도 마찬가지로 인용과 응답의 맥락이 판정을 결정한다.
- 반면 성인 컨텐츠와 NSFW 미디어, 불법 행위 같은 다른 카테고리는 대상 post 자체가 신호를 담고 있어서 스레드까지 확장할 필요가 없다.
"USE_REASONING_CATEGORIES = { ViolentSpeech, SuicideOrSelfHarm }" "USE_THREAD_RENDERER_CATEGORIES = { ViolentSpeech, SuicideOrSelfHarm }" —
grox/flows/ptos/classifier.py:582-594
정본 반영 services/x.md의 PTOS 절 마지막에 "4세대+7 (2026-08-24) — SafetyPtosPolicyCrossValidator 신설" 소절을 추가했다. 4세대+2부터 +7까지 8일에 걸친 흐름을 정리했고, X가 primary와 judge를 서로 다른 모델과 튜닝으로 유지하는 이중 스택을 굳혔다는 해석도 함께 담았다.
1-4. Phoenix 체크포인트 로더가 여러 워커의 동시 복원을 견디도록 바뀌었다
Muon optimizer와 GB300 GPU 세대 이후로 Phoenix 학습이 지금까지의 규모를 넘어서면서, 체크포인트를 복원할 때 겪던 실무 이슈가 정리됐다. 로드 함수가 부분 로드와 동시 디코딩 바이트 상한을 받게 됐고, 같은 노드의 복원을 직렬화하는 락이 생겼다.
새로 알게 된 것L. 체크포인트 로드 함수가 부분 로드, tag, 동시 디코딩 상한을 받는다
- 로드 함수에 인자 3개가 새로 추가됐다.
- 함수는
load_checkpoint이고, 파일은xai_checkpointing/load.py(+178/−36)다.
- 함수는
- tensor마다 읽을 슬라이스를 지정할 수 있다. 특정 tensor만 부분적으로 로드하거나, 로컬 shape이 체크포인트 shape과 다를 때 슬라이스를 명시하는 용도다.
- 인자는
domains: dict[str, Any] | None이고, tensor마다ts.IndexDomain슬라이스를 지정한다. - JSON 스펙과 인덱싱 표현식 두 가지 형식을 지원한다.
- 인자는
- 하나의 base path에 여러 tag의 체크포인트를 함께 두는 관행이 코드에 들어왔다.
- 인자는
tag: str | None = None이다. 기본값은"orbax-ckpt"이고, 체크포인트 서브디렉토리의 이름을 가리킨다.
- 인자는
- 동시에 디코딩되는 tensor의 바이트에 상한을 둘 수 있다.
- 인자는
concurrent_gb: float | None이고, 상한은int(concurrent_gb * 10**9)다. - read를 배치 단위로 끊는다. cur_bytes와 nbytes의 합이 예산을 넘으면 배치를 flush하고 drain한 다음 다음 배치로 넘어간다.
- None이면 스로틀 없이 병렬로 issue한다.
- 인자는
새로 알게 된 것M. 같은 노드의 워커들은 파일 락으로 한 번에 한 배치씩만 복원한다
노드 레벨에서 restore를 직렬화한다. 같은 노드의 여러 JAX 워커가 동시에 restore하는 것을 막아서, 노드 하나가 한 번에 한 배치만 처리하도록 강제한다.
_NODE_SERIALIZE_ENV = "XAI_RESTORE_NODE_SERIALIZE" _NODE_LOCK_FILE_ENV = "XAI_RESTORE_NODE_LOCK_FILE" class _NodeBatchLock: def __init__(self, path: str): self._fd = os.open(path, os.O_CREAT | os.O_RDWR, 0o666) def __enter__(self): t0 = time.time() fcntl.flock(self._fd, fcntl.LOCK_EX) ...- 락 파일의 기본 경로는
/dev/shm/xai_restore_node_lock이고, 이 경로가 없으면/tmp/...를 쓴다. - 1초 이상 대기하면 로그를 남긴다.
- 락 파일의 기본 경로는
배치 사이에는 glibc 할당자가 쥐고 있던 여유 메모리를 반환한다.
gc.collect()와ctypes.CDLL("libc.so.6").malloc_trim(0)을 호출한다.
정본 반영 services/x.md의 Grox 절 뒤에 "Phoenix 체크포인트 로더 다중 노드 하드닝 — 4세대+7 (2026-08-24)" 소절을 추가했다.
의미 이번 로더 변경은 4세대의 훈련 스택이 성숙하고 있다는 신호다. 4세대+6(2026-08-21)이 TRAINING.md와 README를 다시 써서 flagship Muon과 GB300 오버라이드를 export에 정식으로 포함시켰는데, 그 세대의 배치 검증에서 여러 워커가 동시에 restore할 때 노드 메모리를 초과하는 문제를 발견했을 가능성이 있다 추정. Muon 이전에는 모델 크기가 작아서 이런 인프라가 필요 없었지만, GB300 규모에서는 node-lock과 concurrent_gb가 필수가 됐다.
1-5. 작은 변경 3건: 답글 스팸 임계, 점수 write-back, X Spaces 제목
grox의 답글 스팸 파이프라인과 LLM 입력에 작은 변경이 세 가지 있었다.
새로 알게 된 것그 밖의 변경
- grox reply_spam의 follower 임계가 80k에서 100k로 올라갔다.
TaskSpamFilter와TaskReplyRankingFilter둘 다 해당된다.- 08-13부터 11일 동안 다섯 번(15k → 30k → 40k → 60k → 80k → 100k) 올랐다.
- 올릴 때마다 grox 스팸 판정 대상은 넓어지고 답글 랭킹 채점 대상은 좁아졌다 확인 —
task_filter.py:77-92, 214-225.
- grox reply_spam이 답글 랭킹 점수를 Strato에 되쓸 때 지역 캐시 두 곳에도 쓰게 됐다 확인 —
strato_loader.py(+17/−0).grox/flows/reply_spam/strato_loader.py의ReplyRankingScoreStratoLoader는 4세대 공개 때부터 있던 파일이다(47c1bcd, 32줄).- 그때부터 reply ranking 점수를 Strato에
put하고 Kafka v2로 emit했다. - 이번 커밋은
put뒤에, score가 1.0 이하이면 지역 캐시인 Atla와 Pdxa에도 병렬로 쓰는 단계를 추가했다. - 스코어가 1.0을 넘으면 캐시 fanout을 건너뛰는데, 신뢰도가 낮은 판정은 정본에만 남기고 서빙 캐시가 오염되는 것을 막으려는 조치로 보인다 추정.
- X Spaces(오디오) 컨텍스트가 grox로 들어오기 시작했다. 오디오 자체를 듣지는 않지만, 스페이스 제목이 브랜드 안전과 성인 컨텐츠 판정의 재료가 된다.
SpaceMetadata클래스가 새로 생겼고(현재 필드는title하나뿐이다),Post.space_metadata필드가 추가됐으며,post_mapper.py가 이를 매핑한다.grox/core/lm/post.py의 renderer는\n\nThis post has the following audio space card attached:\nAudio Space title: {title}형태로 LLM 프롬프트에 포함시킨다.
의미 오늘 커밋의 세 축은 VF 재작성 검증, 브랜드 안전 판정의 tier 확장과 experiment 실측 인프라, PTOS 심판 계층의 확장으로 요약된다.
- 세 축의 구체적인 내용은 각각 reference_compare, HighRisk와 DDG, 3개 카테고리와 4.5 X_ALGO 재도입이다.
- 4세대의 전체 이야기는 코드를 공개하고, 검증 인프라를 연결하고, experiment를 트래킹하고, 다운스트림에 노출하는 성숙 곡선을 그린다. VF와 브랜드 안전, PTOS 세 서브시스템이 이 순서로 나란히 성숙하고 있다는 사실 자체가, X가 4세대 오픈소스 릴리스를 검증 가능한 상태로 만드는 데 조직의 자원을 여전히 투입하고 있다는 방증이다.
- 4세대+6(08-21) 뒤 사흘 동안 커밋이 없다가 4세대+7(08-24)이 나왔다.
2시청 시간 분포 예측 HEGM이 1.5개월 프로덕션 A/B에서 지표를 올렸다 — 레이더(VK)
자료 Hierarchical Exponential-Gaussian Mixtures for Watch-Time Distribution Prediction — arXiv 2608.23356, 2026-08-24 v1, 논문. 저자는 Sofia Gulevskaia, Mikhail Trapeznikov, Aleksandr Poslavsky, Alexander D'yakonov 4명이다. 네 사람 모두 AI VK와 Lomonosov Moscow State University를 겸직하고 있으며, affiliation은 HTML 판에서 확인했다. 코드와 모델은 github.com/rw404/HEGM에 공개되어 있다.
배경 짧은 비디오 랭킹의 핵심 회귀 타깃은 watch time, 즉 사용자가 특정 비디오를 얼마나 오래 볼지다. 이 예측은 세 가지 특성이 겹쳐서 어렵다.
- near-zero-inflated: 사용자가 3초 이내에 넘겨 버리는 비율이 매우 높아서, 분포의 질량이 0 근처에 크게 몰린다.
- long-tailed: 소수의 사용자는 아주 오래 시청한다.
- multimodal: 가볍게 훑어보는 시청과 몰입해서 보는 시청처럼 여러 모드가 존재한다.
이 문제의 SOTA는 EGMN(Exponential-Gaussian Mixture Network)이다. EGMN은 Gaussian mixture로 조건부 밀도 전체를 모델링해서, 단일 point estimate가 아니라 "3초 이상 시청할 확률" 같은 CDF 기반 이벤트를 예측할 수 있게 해 준다. 이번 논문(HEGM)은 EGMN의 실패 모드 3종에서 출발해 다섯 가지 수정을 더한 모델을 내놓고, 1.5개월 프로덕션 A/B 결과를 공개했다 확인.
새로 알게 된 것A. EGMN은 대규모 재현에서 세 가지 방식으로 망가진다
- EGMN의 실패 모드는 3종이다 확인.
- variance collapse: MLE 학습이 특정 컴포넌트의 σ_k(x)를 0으로 몰아붙여 그 샘플에 likelihood spike를 만들고, 그 결과 분포 자체가 무의미해진다.
- component redundancy: 여러 Gaussian이 μ_i≈μ_j, σ_i≈σ_j로 수렴해서 사실상 같은 컴포넌트를 복제한다.
- inactive components: 대부분의 mixture weight가 0으로 붕괴하며, entropy regularizer를 넣어도 발생한다.
- 이 세 가지 실패가 대규모 재현 연구에서 반복된다는 사실을 발견한 것이 HEGM의 출발점이다.
새로 알게 된 것B. HEGM은 건너뛰기와 몰입 시청을 나눠 모델링하는 등 다섯 가지를 고쳤다
- HEGM이 도입한 수정은 다섯 가지다 확인.
- Hierarchical skip-watch decomposition: sigmoid gate가 skip 확률을 예측한다(
p_skip(x) = σ(W_skip · h + b_skip) ∈ (0, 1)). 최종 밀도는 exponential × p_skip + Gaussian mixture × (1−p_skip)이다. "quick skip = 무관심"인 경우와 "engaged viewing"을 판정 층에서 분리하므로 해석하기 쉬워지고, 서로 다른 실패 모드를 각각 다른 sub-model이 담당하게 된다. - KL 기반 variance regularization을 넣어 variance collapse에 대응한다.
- Structured initialization을 적용한다.
- Forced Gaussian shift를 제거한다.
- Entropy regularizer를 제거한다.
- Hierarchical skip-watch decomposition: sigmoid gate가 skip 확률을 예측한다(
새로 알게 된 것C. 1.5개월 프로덕션 A/B에서 세션 깊이와 공유가 늘고, 건너뛰기와 싫어요가 줄었다
- 프로덕션 A/B의 상세 수치가 HTML 판 결과 절에 매우 구체적으로 공개되어 있다 확인.
- 지면: 짧은 비디오다. VK로 추정한다 추정. 저자가 명시하지는 않았지만, "serving millions of active users"라는 표현과 AI VK 소속이라는 점이 강하게 시사한다.
- 기간: 1.5개월이다(1개월 forward와 2주 reverse swap).
- 트래픽: 처리군과 대조군이 각각 5%이고, 하루에 그룹마다 약 11M 요청이 들어온다.
- 결과는 모두 통계적으로 유의하다.
- session depth +9.26%
- deep watch (≥10s) +5.75%
- non-short watch (≥3s) +4.59%
- skips (<3s) −6.23%
- shares +14.59%
- dislikes −8.34%
"A 1.5-month production A/B test confirms statistically significant engagement lifts." — HEGM abstract, 2026-08-24
정본 반영 radar.md의 "이번 달 신규"에 ### HEGM (VK 러시아) — 짧은 비디오 watch-time 분포 예측, 프로덕션 A/B 상세 수치 공개 절을 추가했고, Densing Law보다 앞에 배치했다.
의미 VK가 프로덕션 진술을 하나 더 쌓았다. 짧은 비디오 프로덕션 랭킹 논문은 최근 몇 달 동안 Kuaishou(DrEM, HD-Rec, PushDualGen)와 Yandex Music Gryphon-v2/Sona에서 계속 나왔고, 이번에는 VK가 또 다른 러시아 리서치 소스로서 진술을 추가했다. AI VK의 프로덕션 규모(수천만 DAU로 추정한다 추정)와 상세 수치를 공개하는 관행을 보면, 앞으로 러시아 플랫폼의 연구를 계속 추적할 가치가 있다.
- watch-time 예측이 두 갈래로 진화하고 있다.
- Netflix Foundation Model의 watch-time head와 X Phoenix의 quantile head 5분위는 point estimate와 quantile을 조합한 방식이다. Phoenix의 5분위는 2026-08-19 커밋(4세대+4)의 P10/P25/P50/P75/P90이다.
- EGMN 계열은 conditional density 전체를 예측하는 방식이며, HEGM이 그 계보의 최신이다.
- 두 접근의 트레이드오프가 계산 비용과 해석 가능성, CDF 이벤트 정확도에서 어떻게 갈리는지가 지켜볼 점이다.
- VK 외에 두 번째 회사가 EGMN 계열의 프로덕션 진술을 내놓으면 topics/multi-task-ranking.md에 절을 신설할 후보가 된다.
3유저 행동 데이터가 커질 때 필요한 tokenization 용량의 법칙을 세웠다 — 레이더(Ant/Alipay)
자료 Towards a Densing Law for User Representation Learning at Billion-Scale Capacity — arXiv 2608.23392, 2026-08-24 v1, 논문. 저자는 9명이다(Bin Dou, Junru Zhang, Zhaoyi Yuan, Wuliang Huang, Letian Gong, Baokun Wang, Huan Li, Yu Cheng, Weiqiang Wang). Ant Group의 DeepFind Team과 Zhejiang University가 협업했고, affiliation은 HTML 판에서 확인했다. DeepFind Team은 Ant Group에서 유저 표현 학습과 관련된 라인으로 보인다.
배경 산업 규모의 유저 표현 학습은 사용자 수와 행동 시퀀스 길이, 모델 크기라는 세 축으로 스케일한다. 이 논문이 짚는 근본 문제는 두 가지다.
- raw text 스케일링에 병목이 있다. billion-scale에서는 raw behavioral text 입력을 늘려도 성능이 diminishing return에 걸린다. behavior를 discrete token으로 변환하는 tokenization이 이를 완화해 주기는 한다.
- tokenization 설정이 데이터 스케일과 함께 얼마나 커져야 하는지에 대한 정량적 분석이 없었다.
이번 논문은 이 관계를 densing law라는 수식으로 정리하고, 그 법칙을 지침으로 삼는 ALGN을 내놓았다 확인.
새로 알게 된 것A. tokenization 용량의 로그와 데이터 스케일의 로그가 대략 선형 관계다
- densing law 수식에 따르면 데이터 스케일의 로그와 tokenization capacity의 로그가 대략 선형 관계를 이룬다 확인.
사용자 수나 시퀀스 길이 가운데 하나만 스케일하는 단일 차원의 식이다.
ln C*(s) = β + α ln(s / s_0)사용자 수와 시퀀스 길이를 동시에 스케일하는 다차원의 식이다.
ln C*(s) = β + Σ_i α_i ln(s_i / s_{i,0})여기서
C*는 최소 충분 tokenization capacity를, s는 데이터 스케일을 뜻하고, α는 데이터 특성과 tokenization 방식에 따라 달라지는 지수다.이 관계는 Densing Law(arXiv 2412.04315)가 LLM에 대해 명명한 관계를 추천 도메인의 tokenization 축으로 옮긴 것이다.
새로 알게 된 것B. ALGN은 이 법칙을 지침으로 tokenization 용량을 조절하지만, abstract에는 개선 수치가 없다
- ALGN(Adaptive Length Group Nested)은 데이터 스케일에 따라 tokenization capacity를 적응적으로 조절하는 variable-length 방식이고, Densing Law가 그 지침 역할을 한다 확인.
- abstract에는 구체적인 개선 수치 없이 이렇게만 적혀 있다: "ALGN outperforms existing baselines".
새로 알게 된 것C. 평가는 billion-scale Alipay 데이터의 offline 벤치마크뿐이고, 프로덕션 배포 진술은 없다
- 평가 규모는 billion-scale Alipay PayBill dataset이다 확인. downstream task는 classification과 text-based retrieval, user-to-user retrieval 3가지이고, 각 held-out test는 0.5M user 규모다.
- 프로덕션 배포에 대한 진술은 없다 확인. offline 벤치마크만 제시한다.
- ALGN이 Alipay 서빙 스택에 반영됐다는 진술은 abstract에도 HTML 판에도 없다.
- "billion-scale Alipay dataset"이라는 데이터 규모 진술만 있을 뿐, A/B 결과와 uplift 숫자, 서빙 지연 같은 프로덕션 진술은 빠져 있다.
"we conduct a pilot study on raw & tokenized scaling comparison on billion-scale Alipay dataset" — Densing Law abstract, 2026-08-24
정본 반영 radar.md의 "이번 달 신규"에 ### User Behavioral Densing Law (Ant/Alipay) — 3번째 회사의 스케일링 법칙 확인 절을 추가했다.
의미 스케일링 법칙 스레드에 Meta·Netflix·ByteDance에 이어 Ant가 다른 축으로 합류했다. 이번 논문은 tokenization capacity 스케일링을 다룬다. 데이터 규모가 커질 때 얼마나 큰 tokenization 어휘와 구조가 필요한지를 정리한 법칙이다.
- 앞서 진술한 회사들은 다른 축을 다뤘다. Meta의 HSTU·Wukong·GEM과 Netflix Foundation Model은 파라미터와 데이터의 스케일링 법칙을 진술했고, ByteDance 광고의 TM20K는 시퀀스 스케일링을 KD(knowledge distillation)로 풀어냈다.
- HSTU는 Meta 유기(organic) 피드 쪽의 시퀀스 모델 계보다.
- 이번 논문은 Meta 광고 쪽 모델인 LLaTTE가 제기한 "semantic feature가 필요한가"와 HSTU가 주장하는 "scaling만으로 충분하다" 사이의 미해소 논쟁에 세 번째 각도로 붙는다.
- Ant Group의 유저 시퀀스 라인이 드러났다. DeepFind Team이 Ant Group에서 유저 표현 학습을 맡은 라인의 이름으로 보인다 추정.
- 이후 Ant Group이 다른 프로덕션 진술을 내놓으면 topics/sequence-transformer-ranking.md로 승격할 후보가 된다. 예를 들어 이 densing law가 Alipay 서빙 스택에 반영됐다는 후속이나, 다른 downstream task의 A/B 결과다.
- 다만 offline 결과만 있다는 한계가 있다. 프로덕션 A/B 진술이 없어서 "실제 서빙에 얼마나 도움이 되는가"는 확인되지 않았다. 다음 논문이나 tech report에서 온라인 결과가 나올 때까지는 관찰 등급을 유지한다.
4추론 트레이스를 붙이면 offline 추천 성능이 떨어진다는 통제 실험이 나왔다 — 레이더(Spotify)
자료 The Disconnect Between Better Descriptive Reasoning Trace Quality and Recommendation Effectiveness — arXiv 2608.23154, 2026-08-24 v1, 논문. 저자 6명 전원이 Spotify Research 소속이다. Gustavo Penha, Juan Elenter, Claudia Hauff, Hugues Bouchard, Paul Bennett, Mounia Lalmas이며, HTML 판에서 이메일 domain이 @spotify.com인 것을 확인했다.
배경 최근 몇 달 동안 generative recommender 라인에서 Semantic ID(SID, 아이템을 학습된 토큰 열로 나타낸 ID) 예측에 chain-of-thought 추론 트레이스를 붙이는 흐름이 여러 논문과 프로덕션 진술로 등장했다.
- 대표 사례는 Kuaishou PushDualGen(arXiv 2608.07989)이다. SID를 먼저 뽑고 건너뛸 수 있는 설명 텍스트(copy)를 붙이는 2단 생성 구조로 프로덕션에 배포했고, effective play rate가 +8.50%, 불만족률이 −37.70%를 기록했다.
- 다른 SIDReasoner 계열도 트레이스가 SID 추론을 개선한다고 주장한다.
문제는 이 라인들이 대체로 각자의 offline 지표나 프로덕션 A/B 하나로 주장을 뒷받침할 뿐, controlled 비교는 부족하다는 점이다. 이번 논문은 그 공백을 메운다. 아이템 표현이 SID인지 자연어 title인지, reasoning trace가 있는지 없는지라는 두 factor를 독립적으로 바꿔 가며 비교한 2×2 factorial 통제 실험이다. backbone은 Qwen3-1.7B로 통일했고, Amazon product 도메인 3개를 사용했다.
새로 알게 된 것A. 설명형 추론 트레이스를 넣으면 offline 추천 성능이 떨어진다
핵심 negative result는 표준 SFT와 RL 학습에서 설명형 reasoning trace를 넣으면 전통적인 offline 추천 성능이 떨어진다는 것이다 확인.
"introducing explicit descriptive reasoning traces reduces traditional offline recommendation effectiveness under standard SFT and RL training" — abstract
- Office Products 도메인에서 Titles 표현과 SFT 학습을 조합하면, trace를 추가했을 때 R@10(상위 10개 추천 안에 정답 아이템이 든 비율)이 .1587 → .1416으로 약 −11% 떨어진다.
- 전체 domain 범위로 보면 Titles는 −19% ~ 0%, SIDs는 −9% ~ 0% 구간이다.
새로 알게 된 것B. 자연어 title이 더 좋은 trace를 만들지만, 추천 지표는 오히려 나빠진다
- Title이 더 좋은 trace를 만들지만 지표는 오히려 나빠진다 확인.
- SID는 opaque learned identifier라서 LLM이 그 위에서 자연어처럼 reasoning하기 어렵다. SID를 자연어와 정렬시키는 추가 학습인 extensive alignment를 붙여야 겨우 trace가 grounded해진다.
- 자연어 title은 alignment가 없어도 grounded하고 해석 가능한 trace를 뽑아낸다.
- 그런데 trace가 좋아져도 recommendation R@10은 떨어진다. 즉 trace quality와 recommendation effectiveness는 서로 독립적이다.
새로 알게 된 것C. 더 풍부한 reward가 격차를 일부 줄이지만, 추론 없는 기준선을 완전히 따라잡지는 못한다
- 더 풍부한 reward signal이 문제를 부분적으로 완화한다 확인. RL 학습에서 reward를 recommendation R@10 자체가 아니라 더 rich한 신호로 바꾸면 격차가 일부 줄어든다. 하지만 여전히 no-reasoning baseline을 완전히 따라잡지는 못한다.
새로 알게 된 것D. 산업 사례는 인용하지 않고, 자체 통제 실험의 조건부 관찰로 정리한다
- industry 사례에 대한 참조는 없다 확인. 관련 연구 절에 SIDReasoner 계열은 등장하지만, Kuaishou PushDualGen이나 그와 유사한 프로덕션 배포를 명시적으로 인용하지는 않는다.
- 논문의 논조도 "이 흐름이 옳은가"를 따지기보다는, 자체 controlled 실험으로 조건부 관찰을 정리하는 쪽이다.
"R@10 drops from .1587 to .1416" — Office Products domain, Titles condition Section: Results, arXiv 2608.23154 HTML
정본 반영 radar.md의 "이번 달 신규"에 ### Descriptive Reasoning Trace가 Recommendation Effectiveness를 떨어뜨린다 (Spotify Research) — SID+CoT 라인의 첫 반박 진술 절을 추가했다.
의미 두 결과는 직접 모순되는 것이 아니라 서로 다른 조건에서 얻은 다른 관찰이다. 하지만 SID에 CoT를 붙이는 라인에 재현 가능한 반박점이 하나 생겼다는 점이 중요하다.
- negative result가 어떤 조건에서 유효한지가 중요하다. 두 자료의 조건이 다르다.
- Kuaishou PushDualGen: push 지면과 프로덕션 A/B, 실제 카탈로그를 사용했고, reward는 effective play와 불만족률처럼 프로덕션 목적에 맞춰 설계했다.
- Spotify: offline 환경에서 Amazon reviews와 Qwen3-1.7B backbone을 사용했고, reward는 standard R@10으로 설계했다.
- 앞으로 SID와 CoT를 결합한 프로덕션 진술이 나올 때는 backbone 크기와 offline인지 online인지, reward 설계 같은 조건들이 관건이 된다.
- Spotify가 SID와 CoT를 결합한 라인을 프로덕션에 배포하지 않는 이유를 짐작할 수 있다. Spotify는 이미 SID(semantic tokenization) 라인에 진지하게 진출한 회사다(PRS 2025 semantic tokenization 발표 참조).
- 그런데 자체 실험에서 negative 결과가 나왔다면, 그 결과가 회사의 프로덕션 로드맵에도 반영됐을 가능성이 있다 추정.
- Spotify의 프로덕션은 SID는 채택하되 CoT는 붙이지 않으리라는 예측이 가능하다.
- 지켜볼 지점은 두 번째 회사의 유사 실험 진술이다. 그런 진술이 나오면 topics/llm-in-recsys.md에 "SID + reasoning trace: production vs benchmark 논쟁"이라는 별도 절을 신설할 후보가 된다.
검증에서 뒤집힌 것
없다. 이번 배치의 신규 자료 세 건(HEGM, Densing Law, Spotify의 추론 트레이스 실험)은 기존 정본을 뒤집지 않는다. 각각 관찰 스레드인 watch-time 예측, 스케일링 법칙, LLM-in-recsys에 새로운 데이터 포인트로 붙는다. X 4세대+7도 4세대 시리즈의 자연스러운 연장이다.
레이더
- 신규 3건:
- HEGM (VK, arXiv 2608.23356)
- User Behavioral Densing Law (Ant/Alipay, arXiv 2608.23392)
- Spotify의 추론 트레이스 negative result (arXiv 2608.23154)
다음에 볼 것
- X 4세대+8, 즉 다음 커밋을 확인한다 — 4세대 원본이 올라온 08-13부터 08-24까지 12일 가운데 8일에 커밋이 올라왔다(08-15·16·22·23은 없다). 지켜볼 점은 다음 다섯 가지다.
- VF reference_compare가 로깅에서 대시보드와 알람으로 승격되는 시점
- BrandSafetyVerdict::HighRisk가 광고 avoid 외에 랭커 감쇠나 유기 노출 차단 같은 후속 조치를 트리거하는지 여부
- PTOS 심판이 스팸과 혐오 발화 카테고리로 확장되는지 여부
- V2 experiment를 승격할지 롤백할지에 대한 결정
- grox reply_spam의 follower 임계를 다음에 어디까지 조정할지(100k에서 120k나 150k로 갈지)
- VK HEGM의 후속을 본다 — 오픈소스 코드가 공개되어 있으므로 다른 회사에서 재현 실험이 나올 가능성이 있다. 특히 짧은 비디오 프로덕션 라인의 다음 회사인 TikTok/ByteDance나 Reels, Meta의 진술을 주목한다.
- Ant/Alipay densing law가 서빙에 반영되는지 후속을 확인한다 — 프로덕션 A/B 진술이 나오면 정본으로 승격한다.
- Spotify 실험을 정본에 반영할지 판단한다 — 두 번째 회사의 유사 실험이 필요하다. Netflix와 Meta, Google 가운데 하나가 controlled 반박 실험을 내놓으면 topics/llm-in-recsys.md에 절을 신설한다.
- 월요일인 2026-08-31에 산업 블로그를 훑는다. 대상은 Pinterest engineering(medium.com/pinterest-engineering)과 research.atspotify.com, Google Research blog다.