0x00

리서치 / 일일 리포트

  • 읽은 자료 1건
  • 정본 반영 1개 파일
  • 레이더 0건
한 줄 요약X가 랭킹 모델 Phoenix의 추론 요청에, 피드 요청이 앱 실행인지 새로고침인지 아래로 스크롤한 것인지를 담는 필드 2개를 추가했다. 나머지는 H100 학습 효율 개선이다.

1랭킹 요청에 피드 요청 맥락 필드가 생기고, H100 학습 패킹이 개선됐다 — X

자료 xai-org/x-algorithm@cb45b55 — xAI 공개 저장소, 2026-10-09 05:42 UTC 커밋, 코드. 파일 16개, +1,228/−218이다. 이 노트들은 4세대 공개 뒤의 X 커밋에 차례로 번호를 붙여 부르며, 이 커밋은 4세대+39다.

배경 X는 For You 피드 코드를 매일 한 커밋씩 동기화해 공개한다. 공개 저장소 xai-org/x-algorithm에서 Phoenix는 유저의 행동 히스토리와 후보 포스트를 하나의 Transformer 시퀀스에 넣어, 좋아요·답글·체류 시간 같은 행동의 확률을 예측하는 랭킹 모델이다. 이번 커밋은 피드 동작 자체보다는 랭킹 모델에 넘기는 요청 메시지와 모델 학습 속도를 다룬다.

새로 알게 된 것A. 랭킹 요청에 "요청 맥락"과 "커서 방향"을 담는 필드가 생겼다

  • Phoenix의 추론 요청 메시지에 피드 요청의 맥락과 커서 방향을 담는 필드 두 개가 추가됐다 확인 — phoenix/python/common/xai-proto/proto/recsys.proto:27-50, 175-176.

    • 메시지 이름은 PredictNextActionsRequest, 필드 이름은 feed_request_context(25번)와 feed_cursor_direction(26번)이다.
      FeedRequestContext feed_request_context = 25;
      FeedCursorDirection feed_cursor_direction = 26;
    

    — recsys.proto (코드), 2026-10-09

  • 요청 맥락 enum은 피드 요청이 생긴 경위를 14가지로 구분한다 확인.

    • enum 이름은 FeedRequestContext다.
    • 앱 실행(LAUNCH), 포그라운드 복귀(FOREGROUND, FOREGROUND_TRUNCATE), 당겨서 새로고침(PULL_TO_REFRESH), 수동 새로고침(MANUAL_REFRESH), 화면 이동(NAVIGATE)이 있다.
    • 그 밖에 뷰포트 기반 새로고침, 폴링, 백그라운드 fetch, 타임라인 공백 메우기(GAP), 가입 직후(SIGNUP), 자기 스레드 보기, AUTO, 기타가 있다.
  • 커서 방향 enum은 첫 요청, 위쪽 새 글 받기, 아래로 스크롤해 더 받기, 공백을 구분한다 확인.

    • enum 이름은 FeedCursorDirection이고, 네 값은 차례로 INITIAL, TOP, BOTTOM, GAP이다.
  • 두 enum은 이전 커밋부터 proto 파일에 정의돼 있었지만, 어떤 메시지에서도 쓰이지 않았다. 이번 diff는 필드 두 줄만 추가했다 확인.

  • 커밋 시점에는 이 값을 읽거나 채우는 코드가 공개 트리 어디에도 없다 확인.

    • 저장소 전체를 grep하면 두 이름은 proto 두 벌(Python용, Rust 서빙 crate용)에서만 나온다.

새로 알게 된 것B. H100 홈 랭커 학습 프리셋이 디바이스당 배치를 두 배로 늘리고 여러 옵션을 켰다

  • 기본 홈 랭커 프리셋은 기반 설정에 H100용 덮어쓰기 값을 합쳐 만든다 확인 — phoenix/xrex/configs/xrecsys.py:324-345, 427-432.
    • 프리셋 이름은 home_direct_packed다. 기반 설정 _home_direct_packed_base()에 _H100_OVERRIDES를 합친다.
  • 디바이스당 배치가 256에서 512로 늘었고, 배치를 마이크로배치 2개로 나누는 설정이 들어왔다. 한 번에 계산하는 단위는 256명으로 같지만, 그래디언트 한 번에 쓰는 유저 수는 두 배가 됐다 확인.
    • 설정 이름은 bs_per_device와 num_microbatch=2다.
    • 마이크로배치(microbatch)는 한 스텝의 배치를 몇 조각으로 나눠 순서대로 계산한 뒤 그래디언트를 합치는 방식이다. 메모리 한도 안에서 큰 배치를 쓰게 해 준다.
  • expert parallelism은 256에서 128로 줄었다 확인.
    • 설정 이름은 ep다.
    • expert parallelism은 MoE 모델의 expert를 여러 디바이스에 나눠 두는 샤딩 방식이다.
  • 옵션 네 개가 켜졌다 확인.
    • 비동기 임베딩 조회(use_async_emb)
    • 호스트 작업 겹치기(overlap_step_host_work)
    • 빈 후보 슬롯 제거(seqpack_drop_empty_candidates)
    • H100 전용 재계산 정책(SAVE_H100_QKV_ATTN_FFN)
      • 재계산 정책(remat policy)은 역전파 때 어떤 중간값을 저장해 두고 어떤 것을 다시 계산할지 정한다.
  • 학습률 7.1e-4와 Muon optimizer 설정은 대부분 그대로이고, Newton-Schulz 계산을 8개 단위로 샤딩하는 옵션 하나만 추가됐다 확인.
    • 옵션 이름은 muon_ns_shard_group_size=8이다.
    • Newton-Schulz 계산은 Muon이 gradient momentum을 근사 직교화할 때 쓰는 반복 계산이다.
  • GB300 프리셋은 바뀌지 않았다 확인.

새로 알게 된 것C. 빈 후보 슬롯을 지우는 새 패킹 레이아웃과 후보 영역 전용 attention 커널이 생겼다

시퀀스 패킹(sequence packing)은 길이가 다른 여러 유저의 시퀀스를 하나의 긴 배열에 이어 붙여 패딩 낭비를 줄이는 학습 기법이다.

  • 기존 패킹은 유저마다 후보 슬롯 개수만큼 자리를 고정으로 잡았기 때문에, 후보가 적은 유저의 빈 슬롯도 attention 계산에 들어갔다. 새 레이아웃은 실제로 채워진 후보만 16개 단위로 올림해 시퀀스 끝의 "후보 영역"에 모은다 확인 — phoenix/xrex/data/recsys/sequence_packing.py:171-203, 579-754.

  • 유저당 후보 토큰 예산은 32와 128 두 단계이고, 스텝마다 필요한 단계를 고른다 확인 — phoenix/xrex/train/trainer_recsys.py:172-195, 291-292, 404-470.

    • 설정 이름은 seqpack_candidate_tokens_per_user다.
    • 학습 프로세스 전체가 스텝마다 필요한 최댓값을 분산 KV 저장소로 합의한 뒤, 그 값을 넘는 가장 작은 단계를 쓴다.
    • 예산을 키운 만큼 히스토리 길이 분포의 평균(기본 510)을 줄여 총 길이를 맞춘다.
  • 128로도 모자라면 유저 안에서 뒤쪽 슬롯의 후보부터 그 배치의 학습에서 뺀다 확인.

    • 빠진 수는 train/seqpack_dropped_candidate_slots로 기록한다.
  • 후보 영역 전용 FlashAttention 커널이 새로 생겼다. 각 후보 토큰은 자기 유저의 히스토리 구간만 attention하고, 커널은 H100(SM90)에서만 동작한다 확인 — phoenix/xrex/cutedsl/ranker_candidate_attention_fa4.py:31, 295.

    • 커널 이름은 ranker_candidate_attention_fa4다. CuTe DSL로 쓴 369줄 분량의 코드다.
    if arch != 90:
        raise NotImplementedError("ranker candidate attention: only SM90 (H100) is supported")
    

    — ranker_candidate_attention_fa4.py (코드), 2026-10-09

새로 알게 된 것D. 그 밖의 변경

  • home-mixer(For You 피드를 조립하는 서비스)의 크론 미러는 동기화 시각만 바뀌었고, 파라미터 값은 바뀌지 않았다 확인.
    • 크론 미러는 프로덕션 파라미터 값을 매일 동기화해 공개하는 파일이고, 여기서는 home-mixer/params/param.rs다.
    • 새 동기화 시각은 2026-10-08T16:00:35Z다.
  • grox(콘텐츠 분류 서비스)의 포스트 타입에 멘션된 유저 목록 필드가 추가됐다. 이 필드를 읽는 분류기는 아직 없다 확인 — grox/core/data_loaders/data_types.py:711, 862-866.
    • 타입 이름은 Post, 필드 이름은 mentioned_users다.

정본 반영 services/x.md에 "4세대+39" 절을 새로 만들어 A~D를 정리했다. 열린 질문 절에는 FeedRequestContext가 피처로 쓰이는지 확인하는 항목을 추가했다. 출처 절의 커밋 목록과 기준 sha에는 cb45b55를 추가했다.

의미 랭킹 모델이 피드 요청의 맥락을 받을 통로가 처음 생겼다 확인. 기존 이해를 뒤집는 내용은 없다.

  • 같은 유저라도 앱을 막 열었을 때와 피드 깊숙이 스크롤했을 때 반응 확률이 다르므로, 이 값이 다음 단계에서 맥락 피처로 쓰일 가능성이 있다 추정. 근거는 요청 메시지에 필드를 추가했다는 것뿐이다.
  • B·C는 모델 구조와 손실을 바꾸지 않는 학습 효율 변경이라 서빙 결과에 직접 영향을 주지 않는다고 본다 추정.
  • 다만 예산을 넘는 배치에서는 후보 일부가 학습에서 빠지므로, 학습 데이터 분포가 조금 달라질 수 있다 추정.

다음에 볼 것

소스 점검 메모

X 커밋 1건 말고는 반영할 새 자료가 없었다.

  • X: 2026-10-09 이후 커밋은 cb45b55 1건이고, 릴리스는 없다.
  • Meta: engineering.fb.com의 최신 글은 여전히 2026-10-06 "NTS: Authenticated Time at Meta"이고, 피드와 무관하다. ai.meta.com/blog의 최신 글은 2026-07로, 신규가 없다. WebSearch 교차 확인에서 나온 Threads 팔로잉 우선 재조정과 Dear Algo는 이미 services/threads.md에 있다.
  • Netflix: netflixtechblog.com RSS의 최신 글은 2026-09-25로, 신규가 없다. research.netflix.com의 추천 영역 페이지는 목록이 렌더링되지 않아 대신 publications archive를 열었고, 2026-10-09 이후 항목은 없다.
  • arXiv cs.IR: 30건을 파싱했고, 수용 기준을 통과한 것은 0건이다. 근접 탈락은 두 건이다.
    • 2610.10920은 e-commerce 검색 페이지에서 추천 모듈을 어디에 넣을지 LM으로 오프라인 평가한 연구다. 소속이 표기되지 않았고, 배포 주장이 없다.
    • 2610.10441(CrossWeave)는 피드 옆 패널에 다른 커뮤니티 글을 보여 주는 브리징 시스템이다. 학술 프로토타입이다.