AI research agents can already propose, implement and score their own machine learning experiments. Idea generation is cheap; verification is not. Training one candidate can consume hours to days of GPU time, so an agent proposes far more candidates than it can afford to run. Which ones get run is the real lever on research progress.
A research team from FAIR at Meta, the University of Oxford and University College London formalizes that lever as research preference and introduces AI Research Preference Models (RPMs). An RPM ranks unexecuted candidates and picks one to execute. It never forecasts an absolute score, the team found language models unreliable at predicting metrics or execution outcomes.
Is it deployable? Partially. RPMs use frozen pretrained LLMs with no fine-tuning, the scaffold AIRA-dojo and benchmark AIRS-Bench are open source, and the backbone Qwen3.6-27B is open weights.
Where the RPM sits in the agent loop
AIRA-dojo is an evolutionary tree search: greedy parent selection, Draft / Improve / Debug operators, highest-validation-score node returned at the end. The RPM intervenes at child creation only. Instead of generating one child and executing it, the agent applies the operator 15 times in parallel to yield 15 unexecuted candidates, then compares them pairwise in a knockout tournament. Only the winner is executed. Each comparison is grounded in context nodes collected by a BFS walk of the explored tree, each shown with the validation score it obtained.
<div class="stepbar" id="sbar">
<button class="sb on" data-s="0"><b>Step 1</b>Select parent node</button>
<button class="sb" data-s="1"><b>Step 2</b>Generate 15 candidates</button>
<button class="sb" data-s="2"><b>Step 3</b>RPM tournament</button>
<button class="sb" data-s="3"><b>Step 4</b>Execute the winner</button>
</div>
<div class="stage">
<svg viewBox="0 0 660 300" role="img" aria-label="Search tree diagram showing parent selection, candidate generation, RPM ranking, and execution">
<g stroke="#2A4A66" stroke-width="2" fill="none">
<path d="M330,58 L250,118"/>
<path d="M330,58 L410,118"/>
<path d="M250,118 L200,182"/>
<path d="M250,118 L300,182"/>
</g>
<g id="tree">
<g>
<circle cx="330" cy="58" r="21" fill="#123049" stroke="#3B6D96" stroke-width="2"/>
<text x="330" y="63" text-anchor="middle" font-size="13" fill="#CFE4F6" font-weight="600">0.44</text>
</g>
<g>
<circle cx="250" cy="118" r="21" fill="#123049" stroke="#3B6D96" stroke-width="2"/>
<text x="250" y="123" text-anchor="middle" font-size="13" fill="#CFE4F6" font-weight="600">0.51</text>
</g>
<g>
<circle cx="200" cy="182" r="21" fill="#3A1F26" stroke="#7C3B49" stroke-width="2"/>
<text x="200" y="187" text-anchor="middle" font-size="11" fill="#E0A5B0" font-weight="600">bug</text>
</g>
<g>
<circle cx="300" cy="182" r="21" fill="#123049" stroke="#3B6D96" stroke-width="2"/>
<text x="300" y="187" text-anchor="middle" font-size="13" fill="#CFE4F6" font-weight="600">0.55</text>
</g>
<g id="parent">
<circle id="pc" cx="410" cy="118" r="21" fill="#123049" stroke="#3B6D96" stroke-width="2"/>
<text x="410" y="123" text-anchor="middle" font-size="13" fill="#CFE4F6" font-weight="600">0.60</text>
</g>
</g>
<g id="g1" class="fade vis">
<circle cx="410" cy="118" r="29" fill="none" stroke="#0866FF" stroke-width="2.5" class="pulse"/>
<text x="410" y="168" text-anchor="middle" font-size="11.5" fill="#59B9FF">highest validation score</text>
</g>
<g id="g2" class="fade">
<g stroke="#2A4A66" stroke-width="1.4" fill="none" stroke-linecap="round">
<path d="M431,131 L500,150"/><path d="M431,131 L500,178"/><path d="M431,131 L500,206"/><path d="M431,131 L500,234"/>
</g>
<g fill="#0E1E2D" stroke="#3B6D96" stroke-width="1.6">
<circle cx="516" cy="150" r="15"/><circle cx="516" cy="178" r="15"/>
<circle cx="516" cy="206" r="15"/><circle cx="516" cy="234" r="15"/>
</g>
<g text-anchor="middle" font-size="11.5" fill="#8FA7BC">
<text x="516" y="154">A</text><text x="516" y="182">B</text>
<text x="516" y="210">C</text><text x="516" y="238">…</text>
</g>
<text x="596" y="196" text-anchor="middle" font-size="11.5" fill="#8FA7BC">15 candidates,</text>
<text x="596" y="211" text-anchor="middle" font-size="11.5" fill="#8FA7BC">none executed</text>
</g>
<g id="g3" class="fade">
<g stroke="#0866FF" stroke-width="1.6" fill="none" class="dash">
<path d="M531,150 L582,150 L582,262 L120,262 L120,205"/>
</g>
<rect x="40" y="205" width="160" height="52" rx="9" fill="#0B2545" stroke="#0866FF" stroke-width="2"/>
<text x="120" y="228" text-anchor="middle" font-size="13" fill="#FFFFFF" font-weight="700">RPM</text>
<text x="120" y="245" text-anchor="middle" font-size="10.5" fill="#9FC6FF">pairwise knockout</text>
<g stroke="#59B9FF" stroke-width="1.4" fill="none" stroke-dasharray="3 4">
<path d="M250,139 L120,200"/><path d="M300,203 L120,214"/>
</g>
<text x="180" y="290" text-anchor="middle" font-size="11" fill="#8FA7BC">context nodes + their validation scores</text>
</g>
<g id="g4" class="fade">
<path d="M410,139 L494,183" stroke="#0866FF" stroke-width="2.5" fill="none"/>
<circle cx="515" cy="196" r="22" fill="#0B2545" stroke="#0866FF" stroke-width="2.5"/>
<text x="515" y="201" text-anchor="middle" font-size="13" fill="#FFFFFF" font-weight="700">0.63</text>
<text x="515" y="243" text-anchor="middle" font-size="11.5" fill="#59B9FF">1 of 15 executed</text>
</g>
</svg>
</div>
<div class="note" id="note1"></div>
<div class="ctrls">
<button class="bt" id="next1">Next step</button>
<button class="bt ghost" id="reset1">Restart</button>
</div>
</section>
<section class="pane" id="p2">
<h2 class="ph">Same job, two compute budgets</h2>
<p class="pl">Both variants are frozen pretrained LLMs — no task-specific training. They differ in whether the judge is allowed to run anything.</p>
<div class="switch" id="sw">
<button class="sw on" data-v="0">Inference-only RPM</button>
<button class="sw" data-v="1">Agentic RPM</button>
</div>
<div class="card">
<div class="flow" id="flow"></div>
<ul class="facts" id="facts"></ul>
</div>
</section>
<section class="pane" id="p3">
<h2 class="ph">20 AIRS-Bench tasks, 24h on one H200, 10 seeds</h2>
<p class="pl">Average normalized score. Both the AIRA-dojo operators and the RPM run on the same Qwen3.6-27B backbone, so the gain comes from the selection layer and not from a stronger judge.</p>
<div class="card" id="barcard">
<div class="row"><span class="lb">No RPM (random)</span><span class="track"><i class="bar b1" data-w="0.684"></i></span><span class="vl">0.684</span></div>
<div class="row"><span class="lb">Inference-only RPM</span><span class="track"><i class="bar b2" data-w="0.711"></i></span><span class="vl">0.711</span></div>
<div class="row"><span class="lb">Agentic RPM</span><span class="track"><i class="bar b3" data-w="0.729"></i></span><span class="vl">0.729</span></div>
<div class="row"><span class="lb">Validation oracle</span><span class="track"><i class="bar b4" data-w="0.748"></i></span><span class="vl">0.748</span></div>
<div class="row"><span class="lb">Test oracle</span><span class="track"><i class="bar b5" data-w="0.759"></i></span><span class="vl">0.759</span></div>
<p class="cap">Bars scaled from 0.60 to 0.80. Oracles execute every candidate and keep the best; both are ceilings, not deployable baselines.</p>
<div class="split">
<div>
<h4 style="margin:0 0 8px 0;font-size:13.5px;">Time to reach the baseline’s final 0.684</h4>
<div class="row"><span class="lb">No RPM</span><span class="track"><i class="bar b1" data-w="t2400"></i></span><span class="vl">24.00h</span></div>
<div class="row"><span class="lb">Inference-only</span><span class="track"><i class="bar b2" data-w="t1488"></i></span><span class="vl">14.88h</span></div>
<div class="row"><span class="lb">Agentic</span><span class="track"><i class="bar b3" data-w="t1550"></i></span><span class="vl">15.50h</span></div>
<p class="cap">1.61× and 1.55× speedups on the same hardware.</p>
</div>
<div>
<h4 style="margin:0 0 8px 0;font-size:13.5px;">New reported state of the art</h4>
<ul class="sotal">
<li>WinoGrande, Agentic RPM — <span>94.1%</span><br>previous agentic SOTA 90.4%</li>
<li>SVAMP, Inference-only RPM — <span>95.7%</span><br>previous human SOTA 94.2%</li>
<li>Probability of improvement over No-RPM — <span>0.5923 / 0.5913</span><br>95% CI lower bounds 0.5066 and 0.5018</li>
</ul>
</div>
</div>
</div>
</section>
<section class="pane" id="p4">
<h2 class="ph">What actually moves selection accuracy</h2>
<p class="pl">Offline evaluation on 1,000 sibling node pairs drawn from 40 unreleased image, video and audio tasks. Random selection scores 50%. Tap a setting to see the measured number.</p>
<div class="card">
<div class="dial">
<h4>Inference-only — search-tree context nodes shown to the judge</h4>
<div class="opts" data-dial="ctx">
<button class="op on" data-v="0">0 nodes</button>
<button class="op" data-v="1">1 node</button>
<button class="op" data-v="2">10 nodes</button>
<button class="op" data-v="3">100 nodes</button>
</div>
<div class="read"><span class="big" id="ctxV">60.7%</span><span class="txt" id="ctxT">Judging on code alone. More history keeps helping, monotonically.</span></div>
<div class="meter"><i id="ctxM"></i></div>
</div>
<div class="dial">
<h4>Inference-only — reasoning budget</h4>
<div class="opts" data-dial="rsn">
<button class="op on" data-v="0">Low effort</button>
<button class="op" data-v="1">High effort</button>
</div>
<div class="read"><span class="big" id="rsnV">61.3%</span><span class="txt" id="rsnT">Letting the judge think longer buys a steady 2.1-point gain.</span></div>
<div class="meter"><i id="rsnM"></i></div>
</div>
<div class="dial">
<h4>Candidate pool size — selection advantage over the batch mean</h4>
<div class="opts" data-dial="pool">
<button class="op on" data-v="0">n = 2</button>
<button class="op" data-v="1">n = 5</button>
<button class="op" data-v="2">n = 10</button>
<button class="op" data-v="3">n = 15</button>
</div>
<div class="read"><span class="big" id="poolV">0.017</span><span class="txt" id="poolT">Oracle ceiling at this pool size: 0.073. A wider pool raises both the ceiling and what the RPM extracts — the end-to-end runs use 15.</span></div>
<div class="meter"><i id="poolM"></i></div>
</div>
<div class="dial">
<h4>Agentic RPM — pilot-experiment time budget</h4>
<div class="opts" data-dial="pilot">
<button class="op on" data-v="0">5 min</button>
<button class="op" data-v="1">30 min</button>
<button class="op" data-v="2">4 hours</button>
</div>
<div class="read"><span class="big" id="pilotV">78.52%</span><span class="txt" id="pilotT">The setting used end-to-end. The pilot shares the research agent’s clock, so longer is not free.</span></div>
<div class="meter"><i id="pilotM"></i></div>
</div>
<div class="dial" style="margin-bottom:0;">
<h4>Backbone and ensembling, offline accuracy</h4>
<table class="tb">
<tr><th>Configuration</th><th>Accuracy</th></tr>
<tr><td>GPT-5</td><td>64.66%</td></tr>
<tr><td>Gemini 3.1 Pro</td><td>67.40%</td></tr>
<tr><td>Claude Opus 4.8</td><td>67.44%</td></tr>
<tr><td>Ensemble, majority vote</td><td>68.04%</td></tr>
<tr class="hi"><td>Ensemble, LLM arbiter</td><td>69.35%</td></tr>
</table>
</div>
</div>
</section>
</div>
<div class="foot">
<span>All figures from <a href="https://arxiv.org/abs/2608.13940" target="_blank" rel="noopener">arXiv:2608.13940</a> (v2, 25 Aug 2026).</span>
<span class="brand">Built by Marktechpost</span>
</div>
</div>
<script>
(function(){
var root = document.getElementById(‘rpmx’);
/* —- height reporting —- */
function report(){
try{
var h = root.offsetHeight + 40;
parent.postMessage({rpmxHeight:h}, ‘*’);
}catch(e){}
}
window.addEventListener(‘load’, report);
window.addEventListener(‘resize’, report);
setInterval(report, 900);
/* —- tabs —- */
var tabs = document.querySelectorAll(‘.tab’);
var panes = document.querySelectorAll(‘.pane’);
for(var i=0;i<tabs.length;i++){
(function(t){
t.addEventListener(‘click’, function(){
for(var j=0;j<tabs.length;j++){ tabs[j].setAttribute(‘aria-selected’,’false’); }
t.setAttribute(‘aria-selected’,’true’);
for(var k=0;k<panes.length;k++){ panes[k].className=’pane’; }
document.getElementById(t.getAttribute(‘data-p’)).className=’pane on’;
if(t.getAttribute(‘data-p’)===’p3′){ drawBars(); }
report();
});
})(tabs[i]);
}
/* ================= PANE 1 ================= */
var notes = [
‘<strong>Greedy parent selection.</strong> AIRA-dojo mutates the node with the highest validation score so far. Buggy nodes are skipped.’,
‘<strong>Parallel child creation.</strong> The chosen operator (Draft, Improve or Debug) is applied 15 times independently. Nothing has run yet, so nothing has a score.’,
‘<strong>Ranking without running.</strong> The RPM compares candidates pairwise in a knockout tournament, grounded in context nodes collected by a BFS walk of the explored tree, each shown with the validation score it earned.’,
‘<strong>One execution.</strong> Only the tournament winner is trained and scored. The other 14 candidates cost tokens, not GPU hours.’
];
var step = 0;
var groups = [‘g1′,’g2′,’g3′,’g4’];
var visMap = [[0],[0,1],[0,1,2],[0,3]];
function renderStep(){
var show = visMap[step];
for(var i=0;i<groups.length;i++){
var on = false;
for(var v=0;v<show.length;v++){ if(show[v]===i){ on = true; } }
document.getElementById(groups[i]).setAttribute(‘class’, on ? ‘fade vis’ : ‘fade’);
}
var pc = document.getElementById(‘pc’);
pc.setAttribute(‘fill’, step>=3 ? ‘#0B2545’ : ‘#123049’);
var sbs = document.querySelectorAll(‘.sb’);
for(var j=0;j<sbs.length;j++){
sbs[j].className = (parseInt(sbs[j].getAttribute(‘data-s’),10)===step) ? ‘sb on’ : ‘sb’;
}
document.getElementById(‘note1’).innerHTML = notes[step];
document.getElementById(‘next1’).textContent = (step===3) ? ‘Loop again’ : ‘Next step’;
report();
}
document.getElementById(‘next1’).addEventListener(‘click’, function(){
step = (step+1) % 4;
renderStep();
});
document.getElementById(‘reset1’).addEventListener(‘click’, function(){ step=0; renderStep(); });
var sbs = document.querySelectorAll(‘.sb’);
for(var s=0;s<sbs.length;s++){
(function(b){ b.addEventListener(‘click’, function(){ step = parseInt(b.getAttribute(‘data-s’),10); renderStep(); }); })(sbs[s]);
}
renderStep();
/* ================= PANE 2 ================= */
var variants = [
{
cls:’fs’,
steps:[
{h:’Read the candidates’, t:’Plan plus code for each unexecuted child, with no execution feedback available.’},
{h:’Read the tree’, t:’Context nodes from earlier in the search, each paired with the validation score it achieved.’},
{h:’Judge pairwise’, t:’A principal-investigator rubric scores problem-model fit, extensibility and risk-adjusted upside.’},
{h:’Return one letter’, t:’The verdict is a boxed choice, never a predicted metric.’}
],
facts:[
{b:’0 GPU-s’, t:’No candidate execution during selection’},
{b:’57.7 → 59.0%’, t:’Offline accuracy after MIPROv2 prompt optimization’},
{b:’0.660 h’, t:’Self-hosted inference latency per 24-hour run’},
{b:’0.711′, t:’Average normalized score end-to-end’}
]
},
{
cls:’fs agent’,
steps:[
{h:’Clone the environment’, t:’An exact copy of the agent sandbox, including one H200, the training set and the unlabeled test set.’},
{h:’Run a pilot’, t:’Tools are python, bash and submit_solution. Candidates are simplified: single-split validation, subsampled data, fewer epochs.’},
{h:’Ask what is missing’, t:’A separate feedback model either proposes the single most informative next experiment or ends the loop.’},
{h:’Decide on evidence’, t:’Task description, candidates and every pilot finding go to the final selection model.’}
],
facts:[
{b:’5 min’, t:’Real pilot budget, reported to the agent as 2,700s to stop it quitting early’},
{b:’30 pilots’, t:’Hard cap, with a 60s stop threshold’},
{b:’Draft + Improve’, t:’Operators where it is deployed; Debug reverts to random’},
{b:’0.729′, t:’Average normalized score end-to-end’}
]
}
];
function renderVariant(v){
var d = variants[v];
var flow = document.getElementById(‘flow’);
flow.innerHTML=”;
for(var i=0;i<d.steps.length;i++){
var el = document.createElement(‘div’);
el.className = d.cls;
el.innerHTML = ‘<h4>’+d.steps[i].h+'</h4>’+d.steps[i].t;
flow.appendChild(el);
}
var kids = flow.children;
for(var k=0;k<kids.length;k++){
(function(node, idx){ setTimeout(function(){ node.className = node.className + ‘ in’; report(); }, 70*idx+40); })(kids[k], k);
}
var fl = document.getElementById(‘facts’);
fl.innerHTML=”;
for(var f=0;f<d.facts.length;f++){
var li = document.createElement(‘li’);
li.innerHTML = ‘<b>’+d.facts[f].b+'</b>’+d.facts[f].t;
fl.appendChild(li);
}
report();
}
var sws = document.querySelectorAll(‘.sw’);
for(var w=0;w<sws.length;w++){
(function(b){
b.addEventListener(‘click’, function(){
for(var q=0;q<sws.length;q++){ sws[q].className=’sw’; }
b.className=’sw on’;
renderVariant(parseInt(b.getAttribute(‘data-v’),10));
});
})(sws[w]);
}
renderVariant(0);
/* ================= PANE 3 ================= */
var drawn = false;
function drawBars(){
var bars = document.querySelectorAll(‘#barcard .bar’);
for(var i=0;i<bars.length;i++){
(function(bar, idx){
var raw = bar.getAttribute(‘data-w’);
var pct;
if(raw.charAt(0)===’t’){
var hrs = parseFloat(raw.substring(1))/100;
pct = (hrs/24)*100;
}else{
pct = ((parseFloat(raw)-0.60)/0.20)*100;
}
setTimeout(function(){ bar.style.width = pct.toFixed(1)+’%’; }, 90*idx+60);
})(bars[i], i);
}
drawn = true;
}
/* ================= PANE 4 ================= */
var dials = {
ctx:{
el:’ctx’, min:50, max:70,
v:[‘60.7%’,’60.9%’,’62.7%’,’65.0%’],
n:[60.7,60.9,62.7,65.0],
t:[‘Judging on code alone. More history keeps helping, monotonically.’,
‘One prior solution and its score barely moves the needle.’,
‘Ten scored solutions start to pay: +2.0 points over no context.’,
‘Deeper history wins. End-to-end runs pack in as many nodes as the context window allows.’]
},
rsn:{
el:’rsn’, min:50, max:70,
v:[‘61.3%’,’63.4%’],
n:[61.3,63.4],
t:[‘Low reasoning effort on the judge.’,
‘Letting the judge think longer buys a steady 2.1-point gain; high effort is used end-to-end.’]
},
pool:{
el:’pool’, min:0, max:0.05,
v:[‘0.017′,’0.030′,’0.038′,’0.045’],
n:[0.017,0.030,0.038,0.045],
t:[‘Oracle ceiling at this pool size: 0.073. Two candidates leave little to choose from.’,
‘Oracle ceiling 0.141. The gap between RPM and oracle widens as the pool grows.’,
‘Oracle ceiling 0.188. The RPM captures a rising share of a rising ceiling.’,
‘Oracle ceiling 0.212. This is the setting used in the end-to-end AIRS-Bench runs.’]
},
pilot:{
el:’pilot’, min:50, max:90,
v:[‘78.52%’,’82.78%’,’84.02%’],
n:[78.52,82.78,84.02],
t:[‘The setting used end-to-end. The pilot shares the research agentu2019s clock, so longer is not free.’,
‘Six times the budget for roughly four extra points.’,
‘Best offline accuracy, but prohibitively expensive inside a 24-hour run.’]
}
};
function setDial(key, idx){
var d = dials[key];
document.getElementById(d.el+’V’).innerHTML = d.v[idx];
document.getElementById(d.el+’T’).innerHTML = d.t[idx];
var pc = ((d.n[idx]-d.min)/(d.max-d.min))*100;
if(pc<2){pc=2;} if(pc>100){pc=100;}
document.getElementById(d.el+’M’).style.width = pc.toFixed(1)+’%’;
}
var groupsEl = document.querySelectorAll(‘.opts’);
for(var g=0;g<groupsEl.length;g++){
(function(grp){
var key = grp.getAttribute(‘data-dial’);
var ops = grp.querySelectorAll(‘.op’);
for(var o=0;o<ops.length;o++){
(function(op){
op.addEventListener(‘click’, function(){
for(var z=0;z<ops.length;z++){ ops[z].className=’op’; }
op.className=’op on’;
setDial(key, parseInt(op.getAttribute(‘data-v’),10));
report();
});
})(ops[o]);
}
setDial(key, 0);
})(groupsEl[g]);
}
report();
})();
</script>
</body>
</html>
“>
Two variants, two compute budgets
Inference-only RPM: An LLM-as-a-judge over candidate plans, code and search history. Its prompt was optimized with MIPROv2 from DSPy, converging on a principal-investigator rubric that tolerates fixable bugs, rewards extensibility and penalizes redundant directions, offline accuracy 57.7% to 59.0%.
Agentic RPM: The same judge and a sandbox that clones the agent’s environment, including a single H200. Tools are python, bash and submit_solution. It runs small-scale pilot experiments, then a feedback model either proposes the most informative next experiment or ends the loop. Two design choices carry weight: the remaining budget is deliberately overstated (2,700s reported against a real 300s) so the agent does not stop early, and pilots are capped at 30 with a 60-second threshold. Pilot time competes with the agent’s own clock, so the agentic selector runs only on Draft and Improve steps; Debug reverts to random.
Results on AIRS-Bench
Setup: 20 public text and tabular tasks, 24 hours on a single H200 per task, 10 seeds, Qwen3.6-27B as backbone for both the operators and the RPM, so the gain comes from the selection layer, not a stronger judge.
| Child selection | Avg. normalized score |
|---|---|
| No RPM (random pick) | 0.684 |
| Inference-only RPM | 0.711 |
| Agentic RPM | 0.729 |
| Validation oracle (ceiling) | 0.748 |
| Test oracle (ceiling) | 0.759 |
Probability of improvement over No-RPM is 0.5923 and 0.5913, with 95% CI lower bounds at 0.5066 and 0.5018.
Efficiency is the more practical result. Inference-only reaches the baseline’s final 0.684 in 14.88 hours (1.61×), agentic in 15.50 hours (1.55×). Self-hosted inference adds 0.660 hours per run; adjusting for it still gives 0.708 at 23.34 hours.
Two new reported SOTA results: WinoGrande 94.1% with the Agentic RPM against a prior agentic SOTA of 90.4% from AIRA₂, and SVAMP 95.7% with inference-only against a prior human SOTA of 94.2%.
Key Takeaways
- RPMs rank unexecuted candidates so an AI research agent runs only the most promising one.
- Two frozen-LLM variants: an inference-only judge, and an agentic judge that runs short pilots.
- On AIRS-Bench, average normalized score rises from 0.684 to 0.711 and 0.729.
- Both hit the baseline’s 24-hour score in roughly 15 hours, a 1.5–1.6× speedup.
- New reported SOTA on WinoGrande (94.1%) and SVAMP (95.7%).
Check out the Paper and the LinkedIn announcement. Also, feel free to follow us on Twitter and don’t forget to join our 150k+ML SubReddit and Subscribe to our Newsletter. Wait! are you on telegram? now you can join us on telegram as well.
Need to partner with us for promoting your GitHub Repo OR Hugging Face Page OR Product Release OR Webinar etc.? Connect with us
The post Meta FAIR Introduces AI Research Preference Models (RPMs): Ranking ML Experiments Before Spending GPU Hours appeared first on MarkTechPost.