feat: update by provider & return index

This commit is contained in:
snsd0805 2024-05-11 17:43:45 +08:00
parent 69feface29
commit 4cc84f8b1e
Signed by: snsd0805
GPG Key ID: 569349933C77A854
2 changed files with 31 additions and 8 deletions

View File

@ -1 +1 @@
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"provider","type":"address"},{"indexed":false,"internalType":"string","name":"dataImage","type":"string"},{"indexed":false,"internalType":"string","name":"trainImage","type":"string"}],"name":"StartRun","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"choose","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"clusters","outputs":[{"internalType":"address","name":"provider","type":"address"},{"internalType":"uint256","name":"gpuId","type":"uint256"},{"internalType":"uint256","name":"clusterSize","type":"uint256"},{"internalType":"bool","name":"available","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"clusterIndex","type":"uint256"}],"name":"getClusterInfo","outputs":[{"components":[{"internalType":"address","name":"provider","type":"address"},{"internalType":"uint256","name":"gpuId","type":"uint256"},{"internalType":"uint256","name":"clusterSize","type":"uint256"},{"internalType":"bool","name":"available","type":"bool"}],"internalType":"struct Scheduler.Cluster","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getClusters","outputs":[{"components":[{"internalType":"address","name":"provider","type":"address"},{"internalType":"uint256","name":"gpuId","type":"uint256"},{"internalType":"uint256","name":"clusterSize","type":"uint256"},{"internalType":"bool","name":"available","type":"bool"}],"internalType":"struct Scheduler.Cluster[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfClusters","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gpuId","type":"uint256"},{"internalType":"uint256","name":"clusterSize","type":"uint256"}],"name":"registerCluster","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"dataImage","type":"string"},{"internalType":"string","name":"trainImage","type":"string"},{"internalType":"uint256","name":"gpuId","type":"uint256"},{"internalType":"uint256","name":"clusterSize","type":"uint256"}],"name":"registerTaskWithConditions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tasks","outputs":[{"internalType":"address","name":"provider","type":"address"},{"internalType":"address","name":"client","type":"address"},{"internalType":"string","name":"dataImage","type":"string"},{"internalType":"string","name":"trainImage","type":"string"},{"internalType":"uint256","name":"status","type":"uint256"}],"stateMutability":"view","type":"function"}] [{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"provider","type":"address"},{"indexed":false,"internalType":"uint256","name":"taskIndex","type":"uint256"},{"indexed":false,"internalType":"string","name":"dataImage","type":"string"},{"indexed":false,"internalType":"string","name":"trainImage","type":"string"}],"name":"StartRun","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"clusters","outputs":[{"internalType":"address","name":"provider","type":"address"},{"internalType":"uint256","name":"gpuId","type":"uint256"},{"internalType":"uint256","name":"clusterSize","type":"uint256"},{"internalType":"bool","name":"available","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"clusterIndex","type":"uint256"}],"name":"getClusterInfo","outputs":[{"components":[{"internalType":"address","name":"provider","type":"address"},{"internalType":"uint256","name":"gpuId","type":"uint256"},{"internalType":"uint256","name":"clusterSize","type":"uint256"},{"internalType":"bool","name":"available","type":"bool"}],"internalType":"struct Scheduler.Cluster","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getClusters","outputs":[{"components":[{"internalType":"address","name":"provider","type":"address"},{"internalType":"uint256","name":"gpuId","type":"uint256"},{"internalType":"uint256","name":"clusterSize","type":"uint256"},{"internalType":"bool","name":"available","type":"bool"}],"internalType":"struct Scheduler.Cluster[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfClusters","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gpuId","type":"uint256"},{"internalType":"uint256","name":"clusterSize","type":"uint256"}],"name":"registerCluster","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"dataImage","type":"string"},{"internalType":"string","name":"trainImage","type":"string"},{"internalType":"uint256","name":"gpuId","type":"uint256"},{"internalType":"uint256","name":"clusterSize","type":"uint256"}],"name":"registerTaskWithConditions","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tasks","outputs":[{"internalType":"address","name":"provider","type":"address"},{"internalType":"address","name":"client","type":"address"},{"internalType":"uint256","name":"clusterIndex","type":"uint256"},{"internalType":"string","name":"dataImage","type":"string"},{"internalType":"string","name":"trainImage","type":"string"},{"internalType":"uint256","name":"status","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"taskIndex","type":"uint256"},{"internalType":"uint256","name":"newStatus","type":"uint256"}],"name":"updateStatus","outputs":[],"stateMutability":"nonpayable","type":"function"}]

View File

@ -12,12 +12,13 @@ contract Scheduler {
struct Task { struct Task {
address provider; address provider;
address client; address client;
uint256 clusterIndex;
string dataImage; string dataImage;
string trainImage; string trainImage;
uint256 status; uint256 status;
} }
event StartRun(address provider, string dataImage, string trainImage); event StartRun(address provider, uint256 taskIndex, string dataImage, string trainImage);
uint256 private randomNumber; uint256 private randomNumber;
Cluster[] public clusters; Cluster[] public clusters;
@ -28,23 +29,27 @@ contract Scheduler {
return randomNumber; return randomNumber;
} }
function registerCluster(uint256 gpuId, uint256 clusterSize) public { function registerCluster(uint256 gpuId, uint256 clusterSize) public returns (uint256) {
address provider = msg.sender; address provider = msg.sender;
clusters.push(Cluster(provider, gpuId, clusterSize, true)); clusters.push(Cluster(provider, gpuId, clusterSize, true));
return clusters.length - 1; // cluster index
} }
function _registerTaskWithSpecificCluster(string memory dataImage, string memory trainImage, uint256 clusterIndex) internal { function _registerTaskWithSpecificCluster(string memory dataImage, string memory trainImage, uint256 clusterIndex) internal returns (uint256) {
require(clusters[clusterIndex].available, "This GPU Cluster has been chosen"); require(clusters[clusterIndex].available, "This GPU Cluster has been chosen");
clusters[clusterIndex].available = false; clusters[clusterIndex].available = false;
address provider = clusters[clusterIndex].provider; address provider = clusters[clusterIndex].provider;
address client = msg.sender; address client = msg.sender;
tasks.push(Task(provider, client, dataImage, trainImage, 1)); tasks.push(Task(provider, client, clusterIndex, dataImage, trainImage, 0));
emit StartRun(provider, dataImage, trainImage); emit StartRun(provider, tasks.length-1, dataImage, trainImage);
return tasks.length - 1; // task index
} }
function registerTaskWithConditions(string memory dataImage, string memory trainImage, uint256 gpuId, uint256 clusterSize) public { function registerTaskWithConditions(string memory dataImage, string memory trainImage, uint256 gpuId, uint256 clusterSize) public returns (uint256) {
uint256[] memory suitable_clusters = new uint256[](clusters.length); uint256[] memory suitable_clusters = new uint256[](clusters.length);
uint256 index = 0; uint256 index = 0;
for (uint256 i=0; i<clusters.length; i++) { for (uint256 i=0; i<clusters.length; i++) {
@ -57,7 +62,25 @@ contract Scheduler {
// random // random
index = _getRandomNumber() % index; index = _getRandomNumber() % index;
_registerTaskWithSpecificCluster(dataImage, trainImage, suitable_clusters[index]); return _registerTaskWithSpecificCluster(dataImage, trainImage, suitable_clusters[index]); // return task index
}
function updateStatus(uint256 taskIndex, uint256 newStatus) public {
/*
0: scheduling: waiting for the provider checking and update the status to 'downloading'
1: downloading
2: training
3: error
4: finished
*/
Task memory task = tasks[taskIndex];
require(task.provider == msg.sender, "you are not the provider for this task");
require(newStatus > task.status && newStatus<=4, "Not correct status code");
task.status = newStatus;
if (newStatus == 3 || newStatus == 4){
clusters[task.clusterIndex].available = true;
}
} }
function getNumberOfClusters() public view returns (uint256) { function getNumberOfClusters() public view returns (uint256) {