Add configurable MTP and shared-weight draft memory fitting
This commit is contained in:
+55
-1
@@ -31,6 +31,58 @@ def prepare_fit_source(directory):
|
||||
if source.count(anchor)!=1:raise ValueError('Fit-Adapter passt nicht zu dieser Version; Build abgebrochen.')
|
||||
path.write_text(source.replace(anchor,marker+'\n'+anchor))
|
||||
|
||||
def prepare_mtp_source(directory):
|
||||
"""Extend the no-allocation fit tool with a shared-weight MTP context."""
|
||||
path=Path(directory)/'tools/fit-params/fit-params.cpp'
|
||||
source=path.read_text()
|
||||
if '// Deck MTP fit v1' in source:
|
||||
if '#include "speculative.h"' not in source:path.write_text(source.replace('#include "fit.h"','#include "fit.h"\n#include "speculative.h"'))
|
||||
return
|
||||
changes={
|
||||
'#include "fit.h"':'#include "fit.h"\n#include "speculative.h"',
|
||||
' common_init();':''' // Deck MTP fit v1
|
||||
bool deck_mtp = false;
|
||||
for (int i = 1; i < argc; ++i) {
|
||||
if (std::string(argv[i]) == "--deck-mtp") {
|
||||
deck_mtp = true;
|
||||
for (int j = i; j + 1 < argc; ++j) argv[j] = argv[j + 1];
|
||||
--argc; --i;
|
||||
}
|
||||
}
|
||||
common_init();''',
|
||||
' auto mparams = common_model_params_to_llama(params);':''' if (deck_mtp) params.speculative.types = {COMMON_SPECULATIVE_TYPE_DRAFT_MTP};
|
||||
auto mparams = common_model_params_to_llama(params);''',
|
||||
' auto cparams = common_context_params_to_llama(params);':''' auto cparams = common_context_params_to_llama(params);
|
||||
auto draft_params = common_base_params_to_speculative(params);
|
||||
auto draft_mparams = common_model_params_to_llama(draft_params);
|
||||
auto draft_cparams = common_context_params_to_llama(draft_params);
|
||||
draft_cparams.ctx_type = LLAMA_CONTEXT_TYPE_MTP;
|
||||
draft_cparams.n_rs_seq = 0;
|
||||
const common_fit_extra_model draft_extra = {
|
||||
params.model.path.c_str(), &draft_mparams, &draft_cparams, true
|
||||
};''',
|
||||
' nullptr,':' deck_mtp ? &draft_extra : nullptr,',
|
||||
' common_fit_print(params.model.path.c_str(), &mparams, &cparams);':''' if (!deck_mtp) {
|
||||
common_fit_print(params.model.path.c_str(), &mparams, &cparams);
|
||||
} else {
|
||||
std::vector<ggml_backend_dev_t> devs, draft_devs;
|
||||
uint32_t ngl, ctx, expert;
|
||||
auto main_mem = common_get_device_memory_data(params.model.path.c_str(), &mparams, &cparams, devs, ngl, ctx, expert, GGML_LOG_LEVEL_ERROR);
|
||||
auto draft_mem = common_get_device_memory_data(params.model.path.c_str(), &draft_mparams, &draft_cparams, draft_devs, ngl, ctx, expert, GGML_LOG_LEVEL_ERROR);
|
||||
if (main_mem.size() != draft_mem.size() || devs != draft_devs) return 2;
|
||||
for (size_t i = 0; i < main_mem.size(); ++i) {
|
||||
const auto & a = main_mem[i]; const auto & b = draft_mem[i];
|
||||
auto mib = [](size_t x) { return (x + 1048575) / 1048576; };
|
||||
printf("%s %zu %zu %zu\\n", i < devs.size() ? ggml_backend_dev_name(devs[i]) : "Host",
|
||||
mib(a.model), mib(a.context + b.context), mib(a.compute + b.compute));
|
||||
}
|
||||
}'''
|
||||
}
|
||||
for old,new in changes.items():
|
||||
if source.count(old)!=1:raise ValueError('MTP-Fit-Adapter passt nicht zu dieser Version; Build abgebrochen.')
|
||||
source=source.replace(old,new)
|
||||
path.write_text(source)
|
||||
|
||||
class Runtime:
|
||||
def __init__(self,root):
|
||||
self.root=Path(root);self.lock=threading.RLock();self.process=None;self.cancelled=threading.Event();self.busy=False
|
||||
@@ -98,15 +150,17 @@ class Runtime:
|
||||
self.run(['git','checkout','--detach','FETCH_HEAD'],directory,'Feste Version auswählen',30)
|
||||
commit=command(['git','-C',str(directory),'rev-parse','HEAD'])
|
||||
prepare_fit_source(directory)
|
||||
prepare_mtp_source(directory)
|
||||
arch=sorted(set(g['architecture'] for g in prereq['gpus']))
|
||||
args=['cmake','-S','.', '-B','build','-DCMAKE_BUILD_TYPE=Release','-DGGML_NATIVE=OFF','-DLLAMA_BUILD_TESTS=OFF','-DLLAMA_BUILD_EXAMPLES=OFF','-DLLAMA_BUILD_SERVER=ON','-DGGML_CUDA='+('ON' if backend=='CUDA' else 'OFF')]
|
||||
if backend=='CUDA':args+=['-DCMAKE_CUDA_ARCHITECTURES='+';'.join(arch)]
|
||||
self.run(args,directory,'Build konfigurieren',300)
|
||||
self.run(['cmake','--build','build','--target','llama-server','llama-fit-params','-j',str(jobs)],directory,'llama.cpp-Werkzeuge kompilieren')
|
||||
(directory/'build/bin/deck-mtp-fit-v1').write_text('shared weights + main and MTP contexts, f16 draft KV\n')
|
||||
binary=directory/'build/bin/llama-server'
|
||||
self.run([str(binary),'--version'],directory,'Binärdatei prüfen',30)
|
||||
help_text=command([str(binary),'--help'],30)
|
||||
item=dict(id=ident,revision=revision,commit=commit,backend=backend,architectures=arch if backend=='CUDA' else [],created=time.time(),fit_supported='--fit ' in help_text,fit_tool=(directory/'build/bin/llama-fit-params').exists(),fit_adapter='shared-kv-pool-v1')
|
||||
item=dict(id=ident,revision=revision,commit=commit,backend=backend,architectures=arch if backend=='CUDA' else [],created=time.time(),fit_supported='--fit ' in help_text,fit_tool=(directory/'build/bin/llama-fit-params').exists(),fit_adapter='shared-kv-mtp-v1')
|
||||
with self.lock:
|
||||
self.state['builds'].append(item);self.state['job'].update(state='complete',phase='Build geprüft; kann als Standard ausgewählt werden.');self.save()
|
||||
except Exception as exc:
|
||||
|
||||
Reference in New Issue
Block a user